Descriptive analysis

2022-09-26

Import data

serology <- read_csv("./01_data/raw/FFI.peru.serology.kmeans2.csv") %>%
  rename(ffi_is_code = Codigo) %>%
  select(-1)

ffi_individual <- read_csv("./01_data/raw/individuals_result_share_072022.csv")
ffi_household <- read_csv("./01_data/raw/household_gps_share_072022.csv")
data_2000_2019 <- read_csv("./01_data/raw/Data_FFI_2000_2019_20212405.csv")
data_2020_2021 <- read_csv("./01_data/raw/Data_FFI_2020_2021_20210629.csv")
poblacion <- readRDS("./01_data/raw/poblacion_inei_2017.rds")

Format data

ffi_total <- ffi_individual %>%
  full_join(
    serology %>%
      mutate(
        ffi_is_code = paste0(0, ffi_is_code)
      ),
    by = "ffi_is_code"
  )

ffi_total <- ffi_total %>%
  mutate(
    age_cat = case_when(
      ffi_is_age_fixed >= 70 ~ "[70+)",
      ffi_is_age_fixed >= 60 ~ "[60-70)",
      ffi_is_age_fixed >= 50 ~ "[50-60)",
      ffi_is_age_fixed >= 40 ~ "[40-50)",
      ffi_is_age_fixed >= 30 ~ "[30-40)",
      ffi_is_age_fixed >= 20 ~ "[20-30)",
      ffi_is_age_fixed >= 10 ~ "[10-20)",
      ffi_is_age_fixed >= 0 ~ "[0-10)"
    ),
    age_cat = factor(age_cat),
    age_code = case_when(
      age_cat == "[70+)" ~ 8,
      age_cat == "[60-70)" ~ 7,
      age_cat == "[50-60)" ~ 6,
      age_cat == "[40-50)" ~ 5,
      age_cat == "[30-40)" ~ 4,
      age_cat == "[20-30)" ~ 3,
      age_cat == "[10-20)" ~ 2,
      age_cat == "[0-10)" ~ 1,
    ),
    gender = factor(
      ffi_is_sex,
      labels = c("Male", "Female")
    ),
    ffi_is_malaria = factor(
      ffi_is_malaria,
      labels = c("No", "Yes", "Don't Know / No Answer")
    ),
    across(
      c(pf_recent:pv_historic),
      ~ factor(., labels = c("Negative", "Positive"))
    ),
    across(
      c(
        ffi_is_fever_month,
        ffi_is_antimal_drug_use, 
        ffi_is_mosq_net
      ),
      ~ factor(., labels = c("No", "Yes"))
    ),
    ffi_is_trip_month = factor(
      ffi_is_trip_month,
      labels = c("No", "Yes", "Don't Know/No Answer")
    ),
    ffi_is_mal_lifetime = factor(
      ffi_is_mal_lifetime,
      labels = c(
        "1 to 3 times",
        "3 to 7 times",
        "More than 7 times"
      )
    ),
    ffi_is_place_shower = factor(
      ffi_is_place_shower,
      labels = c(
        "Bathroom inside the dwelling",
        "Bathroom outside the dwelling",
        "In the countryside/river",
        "Other"
      )
    ),
    education_level = case_when(
      ffi_is_inst_level %in% 0 ~ "No schooling", 
      ffi_is_inst_level %in% 1:2 ~ "Primary school",
      ffi_is_inst_level %in% 3:4 ~ "Secondary school",
      ffi_is_inst_level %in% 5:6 ~ "Higher education"
    ),
    education_level = fct_relevel(education_level, "No schooling",
                                  "Primary school",
                                  "Secondary school"),
    economic_activities = factor(ffi_is_main_econ_act,
                                 labels = c("Day labourer",
                                            "Wood extractor",
                                            "Fisherman",
                                            "Livestock farmer",
                                            "Farmer",
                                            "Trader",
                                            "Housewife",
                                            "Student",
                                            "Motorcycle taxi driver",
                                            "None",
                                            "Other")),
    pv_exposure = case_when(
      pv_recent == "Negative" & pv_historic == "Negative" ~ "Negative",
      is.na(pv_recent) & is.na(pv_historic) ~ NA_character_,
      TRUE ~ "Positive"
    ),
    pf_exposure = case_when(
      pf_recent == "Negative" & pf_historic == "Negative" ~ "Negative",
      is.na(pf_recent) & is.na(pf_historic) ~ NA_character_,
      TRUE ~ "Positive"
    ),
    recent_exposure = case_when(
      pv_recent == "Negative" & pf_recent == "Negative" ~ "Negative",
      is.na(pv_recent) & is.na(pf_recent) ~ NA_character_,
      TRUE ~ "Positive"
    ),
    historical_exposure = case_when(
      pv_historic == "Negative" & pf_historic == "Negative" ~ "Negative",
      is.na(pv_historic) & is.na(pf_historic) ~ NA_character_,
      TRUE ~ "Positive"
    ),
    only_pv_exposure = case_when(
      pv_exposure == "Positive" & pf_exposure == "Negative" ~ "Positive", 
      TRUE ~ "Negative"
    ),
    only_pf_exposure = case_when(
      pf_exposure == "Positive" & pv_exposure == "Negative" ~ "Positive", 
      TRUE ~ "Negative"
    ),
    pv_pf_exposure = case_when(
      pv_exposure == "Positive" & pf_exposure == "Positive" ~ "Positive",
      TRUE ~ "Negative"
    ),
    freedom_malaria = case_when(
      pv_exposure == "Negative" & pf_exposure == "Negative" ~ "Positive", 
      TRUE ~ "Negative"
    ),
    only_pv_recent = case_when(
      pv_recent == "Positive" & pf_recent == "Negative" ~ "Positive", 
      TRUE ~ "Negative"
    ),
    only_pf_recent = case_when(
      pf_recent == "Positive" & pv_recent == "Negative" ~ "Positive", 
      TRUE ~ "Negative"
    ),
    pv_pf_recent = case_when(
      pv_recent == "Positive" & pf_recent == "Positive" ~ "Positive",
      TRUE ~ "Negative"
    ),
    freedom_malaria_recent = case_when(
      pv_recent == "Negative" & pf_recent == "Negative" ~ "Positive", 
      TRUE ~ "Negative"
    ),
    only_pv_historic = case_when(
      pv_historic == "Positive" & pf_historic == "Negative" ~ "Positive", 
      TRUE ~ "Negative"
    ),
    only_pf_historic = case_when(
      pf_historic == "Positive" & pv_historic == "Negative" ~ "Positive", 
      TRUE ~ "Negative"
    ),
    pv_pf_historic = case_when(
      pv_historic == "Positive" & pf_historic == "Positive" ~ "Positive",
      TRUE ~ "Negative"
    ),
    freedom_malaria_historic = case_when(
      pv_historic == "Negative" & pf_historic == "Negative" ~ "Positive", 
      TRUE ~ "Negative"
    ),
    across(c(pv_exposure:freedom_malaria_historic), factor)
  )

labelled::var_label(ffi_total) <- list(
  ffi_is_district = "Districs",
  gender = "Gender",
  age_cat = "Age",
  education_level = "Education Level",
  economic_activities = "Economic Activities",
  pf_recent = "Recent P. Falciparum",
  pf_historic = "Historical P. Falciparum",
  pv_recent = "Recent P. Vivax",
  pv_historic = "Historical P. Vivax",
  pv_exposure = "P. Vivax Exposure",
  pf_exposure = "P. Falciparum Exposure"
)
saveRDS(ffi_total, 
        file = "01_data/processed/ffi_total.rds")

Table descriptive

library(gtsummary)

fisher.test.simulate.p.values <- function(data, variable, by, ...) {
  result <- list()
  test_results <- stats::fisher.test(data[[variable]], data[[by]], simulate.p.value = TRUE)
  result$p <- test_results$p.value
  result$test <- test_results$method
  result
}

Table for district

table_1 <- ffi_total %>%
  select(
    ffi_is_district,
    gender,
    age_cat,
    education_level,
    economic_activities,
    pf_recent:pv_historic
  ) %>%
  tbl_summary(
    by = "ffi_is_district",
    missing_text = "Missing"
  ) %>%
  add_n() %>%
  add_overall() %>%
  add_p(
     test = list(all_categorical() ~ "fisher.test.simulate.p.values")
  ) %>% 
  bold_p() %>%
  modify_header(label = "**Variable**") %>%
  bold_labels()
  
table1
## # A tibble: 6 × 4
##   country      year  cases population
##   <chr>       <int>  <int>      <int>
## 1 Afghanistan  1999    745   19987071
## 2 Afghanistan  2000   2666   20595360
## 3 Brazil       1999  37737  172006362
## 4 Brazil       2000  80488  174504898
## 5 China        1999 212258 1272915272
## 6 China        2000 213766 1280428583
table_1 %>%
  as_flex_table() %>%
  flextable::save_as_docx(path = "./02_output/reports/table1.docx")

Table for Plasmodium

 table2 <- ffi_total %>%
   select(
     gender,
     age_cat,
     education_level,
     economic_activities,
     pf_exposure,
     pv_exposure
   ) %>%
   drop_na(pf_exposure, pv_exposure) %>%
   pivot_longer(
     cols = pv_exposure:pf_exposure,
     names_to = "exposure",
     values_to = "result_exposure"
   ) %>%
   mutate(
    exposure = case_when(
      exposure == "pv_exposure" ~ "P. Vivax Exposure",
      exposure == "pf_exposure" ~ "P. Falciparum Exposure"
    )
   ) %>%
   tbl_strata(
    strata = exposure,
    .tbl_fun =
      ~ .x %>%
          tbl_summary(
            by = result_exposure,
            missing_text = "Missing"
          ) %>%
          add_p(
            test = list(all_categorical() ~ "fisher.test.simulate.p.values")
          ) %>%
          bold_p() %>%
          modify_header(label = "**Variable**") %>%
          bold_labels() 
   ) 

table2_overall <- ffi_total %>%
  select(
    gender,
    age_cat,
    education_level,
    economic_activities,
    pf_exposure,
    pv_exposure
  ) %>%
  drop_na(pf_exposure, pv_exposure) %>%
  tbl_summary(
    missing_text = "Missing"
  ) %>%
  modify_header(
    label = "**Variable**"
  ) %>%
  bold_labels() %>%
  modify_spanning_header(stat_0 ~ "**Overall**")

table2 <- tbl_merge(
  tbls = list(table2, table2_overall),
  tab_spanner = FALSE
)

table2
Variable P. Falciparum Exposure P. Vivax Exposure Overall
Negative, N = 3,8971 Positive, N = 991 p-value2 Negative, N = 3,6831 Positive, N = 3131 p-value2 N = 3,9961
Gender 0.083 <0.001
Male 2,007 (52%) 60 (61%) 1,839 (50%) 228 (73%) 2,067 (52%)
Female 1,890 (48%) 39 (39%) 1,844 (50%) 85 (27%) 1,929 (48%)
Age 0.013 <0.001
[0-10) 1,075 (28%) 15 (15%) 1,089 (30%) 1 (0.3%) 1,090 (27%)
[10-20) 905 (23%) 19 (19%) 913 (25%) 11 (3.5%) 924 (23%)
[20-30) 372 (9.6%) 8 (8.2%) 360 (9.8%) 20 (6.4%) 380 (9.5%)
[30-40) 423 (11%) 11 (11%) 380 (10%) 54 (17%) 434 (11%)
[40-50) 350 (9.0%) 13 (13%) 300 (8.2%) 63 (20%) 363 (9.1%)
[50-60) 332 (8.5%) 14 (14%) 285 (7.8%) 61 (20%) 346 (8.7%)
[60-70) 212 (5.5%) 8 (8.2%) 177 (4.8%) 43 (14%) 220 (5.5%)
[70+) 219 (5.6%) 10 (10%) 170 (4.6%) 59 (19%) 229 (5.7%)
Missing 9 1 9 1 10
Education Level 0.023 <0.001
No schooling 754 (19%) 10 (10%) 743 (20%) 21 (6.7%) 764 (19%)
Primary school 1,866 (48%) 59 (60%) 1,723 (47%) 202 (65%) 1,925 (48%)
Secondary school 1,176 (30%) 30 (30%) 1,117 (30%) 89 (28%) 1,206 (30%)
Higher education 98 (2.5%) 0 (0%) 97 (2.6%) 1 (0.3%) 98 (2.5%)
Missing 3 0 3 0 3
Economic Activities 0.001 <0.001
Day labourer 854 (22%) 13 (13%) 847 (23%) 20 (6.4%) 867 (22%)
Wood extractor 30 (0.8%) 3 (3.1%) 27 (0.7%) 6 (1.9%) 33 (0.8%)
Fisherman 25 (0.6%) 2 (2.0%) 20 (0.5%) 7 (2.2%) 27 (0.7%)
Livestock farmer 72 (1.8%) 3 (3.1%) 62 (1.7%) 13 (4.2%) 75 (1.9%)
Farmer 1 (<0.1%) 0 (0%) 1 (<0.1%) 0 (0%) 1 (<0.1%)
Trader 873 (22%) 37 (38%) 723 (20%) 187 (60%) 910 (23%)
Housewife 100 (2.6%) 4 (4.1%) 99 (2.7%) 5 (1.6%) 104 (2.6%)
Student 656 (17%) 16 (16%) 619 (17%) 53 (17%) 672 (17%)
Motorcycle taxi driver 1,128 (29%) 19 (19%) 1,136 (31%) 11 (3.5%) 1,147 (29%)
None 21 (0.5%) 0 (0%) 20 (0.5%) 1 (0.3%) 21 (0.5%)
Other 135 (3.5%) 1 (1.0%) 126 (3.4%) 10 (3.2%) 136 (3.4%)
Missing 2 1 3 0 3
P. Falciparum Exposure
Negative 3,897 (98%)
Positive 99 (2.5%)
P. Vivax Exposure
Negative 3,683 (92%)
Positive 313 (7.8%)
1 n (%)
2 Fisher's Exact Test for Count Data; Fisher's Exact Test for Count Data with simulated p-value (based on 2000 replicates)
table2 %>%
  as_flex_table() %>%
  flextable::save_as_docx(path = "./02_output/reports/table2.docx")

Table for Exposure Time

 table3 <- ffi_total %>%
   select(
     gender,
     age_cat,
     education_level,
     economic_activities,
     recent_exposure,
     historical_exposure
   ) %>%
   drop_na(recent_exposure, historical_exposure) %>%
   pivot_longer(
     cols = recent_exposure:historical_exposure,
     names_to = "exposure",
     values_to = "result_exposure"
   ) %>%
   mutate(
    exposure = case_when(
      exposure == "recent_exposure" ~ "Recent Exposure",
      exposure == "historical_exposure" ~ "Historical Exposure"
    )
   ) %>%
   tbl_strata(
    strata = exposure,
    .tbl_fun =
      ~ .x %>%
          tbl_summary(
            by = result_exposure,
            missing_text = "Missing"
          ) %>%
          add_p(
            test = list(all_categorical() ~ "fisher.test.simulate.p.values")
          ) %>%
          bold_p() %>%
          modify_header(label = "**Variable**") %>%
          bold_labels() 
   ) 

table3_overall <- ffi_total %>%
  select(
    gender,
    age_cat,
    education_level,
    economic_activities,
    recent_exposure,
    historical_exposure
  ) %>%
  drop_na(recent_exposure, historical_exposure) %>%
  tbl_summary(
    missing_text = "Missing"
  ) %>%
  modify_header(
    label = "**Variable**"
  ) %>%
  bold_labels() %>%
  modify_spanning_header(stat_0 ~ "**Overall**")

table3 <- tbl_merge(
  tbls = list(table3, table3_overall),
  tab_spanner = FALSE
)

table3
Variable Historical Exposure Recent Exposure Overall
Negative, N = 3,7281 Positive, N = 2681 p-value2 Negative, N = 3,7931 Positive, N = 2031 p-value2 N = 3,9961
Gender <0.001 <0.001
Male 1,886 (51%) 181 (68%) 1,910 (50%) 157 (77%) 2,067 (52%)
Female 1,842 (49%) 87 (32%) 1,883 (50%) 46 (23%) 1,929 (48%)
Age <0.001 <0.001
[0-10) 1,085 (29%) 5 (1.9%) 1,079 (29%) 11 (5.5%) 1,090 (27%)
[10-20) 899 (24%) 25 (9.3%) 918 (24%) 6 (3.0%) 924 (23%)
[20-30) 366 (9.8%) 14 (5.2%) 366 (9.7%) 14 (7.0%) 380 (9.5%)
[30-40) 392 (11%) 42 (16%) 406 (11%) 28 (14%) 434 (11%)
[40-50) 309 (8.3%) 54 (20%) 327 (8.6%) 36 (18%) 363 (9.1%)
[50-60) 303 (8.1%) 43 (16%) 305 (8.1%) 41 (20%) 346 (8.7%)
[60-70) 182 (4.9%) 38 (14%) 197 (5.2%) 23 (11%) 220 (5.5%)
[70+) 182 (4.9%) 47 (18%) 187 (4.9%) 42 (21%) 229 (5.7%)
Missing 10 0 8 2 10
Education Level <0.001 <0.001
No schooling 747 (20%) 17 (6.3%) 745 (20%) 19 (9.4%) 764 (19%)
Primary school 1,754 (47%) 171 (64%) 1,792 (47%) 133 (66%) 1,925 (48%)
Secondary school 1,126 (30%) 80 (30%) 1,156 (31%) 50 (25%) 1,206 (30%)
Higher education 98 (2.6%) 0 (0%) 97 (2.6%) 1 (0.5%) 98 (2.5%)
Missing 3 0 3 0 3
Economic Activities <0.001 <0.001
Day labourer 849 (23%) 18 (6.7%) 848 (22%) 19 (9.4%) 867 (22%)
Wood extractor 29 (0.8%) 4 (1.5%) 28 (0.7%) 5 (2.5%) 33 (0.8%)
Fisherman 21 (0.6%) 6 (2.2%) 22 (0.6%) 5 (2.5%) 27 (0.7%)
Livestock farmer 63 (1.7%) 12 (4.5%) 67 (1.8%) 8 (3.9%) 75 (1.9%)
Farmer 1 (<0.1%) 0 (0%) 1 (<0.1%) 0 (0%) 1 (<0.1%)
Trader 770 (21%) 140 (52%) 787 (21%) 123 (61%) 910 (23%)
Housewife 99 (2.7%) 5 (1.9%) 100 (2.6%) 4 (2.0%) 104 (2.6%)
Student 623 (17%) 49 (18%) 646 (17%) 26 (13%) 672 (17%)
Motorcycle taxi driver 1,124 (30%) 23 (8.6%) 1,139 (30%) 8 (3.9%) 1,147 (29%)
None 20 (0.5%) 1 (0.4%) 21 (0.6%) 0 (0%) 21 (0.5%)
Other 127 (3.4%) 9 (3.4%) 131 (3.5%) 5 (2.5%) 136 (3.4%)
Missing 2 1 3 0 3
recent_exposure
Negative 3,793 (95%)
Positive 203 (5.1%)
historical_exposure
Negative 3,728 (93%)
Positive 268 (6.7%)
1 n (%)
2 Fisher's Exact Test for Count Data; Fisher's Exact Test for Count Data with simulated p-value (based on 2000 replicates)
table3 %>%
  as_flex_table() %>%
  flextable::save_as_docx(path = "./02_output/reports/table3.docx")

Distance communities and regional Hospital

iquitos_centro <- tibble(
  "ffi_h_health_facility_name" = "Hospital Regional de Loreto",
  Longitude = -73.25385902080906,
  Latitude = -3.7264060164148716,
) %>%
  st_as_sf(coords = c("Longitude", "Latitude"), crs = 4326) %>%
  st_transform(crs = 32718)

communities_sf <- ffi_household %>%
  select(
    ffi_h_district,
    ffi_h_code_community,
    ffi_h_community,
    ffi_gps_long,
    ffi_gps_lat
  ) %>%
  st_as_sf(
    coords = c("ffi_gps_long", "ffi_gps_lat"),
    crs = 4326
  ) %>%
  group_by(ffi_h_district, ffi_h_code_community, ffi_h_community) %>%
  summarise() %>%
  st_centroid()
  

communities_distances <- communities_sf %>%
  st_transform(crs = 32718) %>%
  st_distance(iquitos_centro)

communities_distances <- enframe(communities_distances) %>%
  mutate(
    ffi_is_cod_com = communities_sf$ffi_h_code_community,
    ffi_is_community = communities_sf$ffi_h_community,
    distance = as.numeric(value)
  ) %>%
  select(-c(name, value))

Las Comunidades mas cercanas y mas lejanas por distrito:

communities_distances %>%
  mutate(
    ffi_h_district = communities_sf$ffi_h_district
  ) %>%
  group_by(ffi_h_district) %>%
  slice_min(distance, n = 1) %>%
  bind_rows(
    communities_distances %>%
      mutate(
        ffi_h_district = communities_sf$ffi_h_district
      ) %>%
      group_by(ffi_h_district) %>%
      slice_max(distance, n = 1)
  ) %>%
  arrange(ffi_h_district, distance)
## # A tibble: 4 × 4
## # Groups:   ffi_h_district [2]
##   ffi_is_cod_com ffi_is_community distance ffi_h_district
##   <chr>          <chr>               <dbl> <chr>         
## 1 30             URB. BAGAZAN        4136. BELEN         
## 2 20             PEÑA BLANCA        42830. BELEN         
## 3 11             VILLA ESTHER       17189. INDIANA       
## 4 02             MANATI ZONA 2      53093. INDIANA

Plots

Malaria Annual Parasite Index

data_malaria <- bind_rows(
  data_2000_2019,
  data_2020_2021
) %>%
  drop_na(District)

pob_loreto <- poblacion %>%
  filter(dep == "LORETO") %>%
  select(District = distr, Total)
malaria_cases_pob <- data_malaria %>%
  rowwise() %>%
  mutate(
    cases_malaria = sum(
      c_across(c(
        `Confirmed P. Falciparum`,
        `Confirmed P. Vivax`
      )),
      na.rm = TRUE
    )
  ) %>%
  group_by(District) %>%
  summarise(cases_malaria = sum(cases_malaria))

malaria_cases_pob <- malaria_cases_pob %>%
  left_join(
    pob_loreto
  ) %>%
  mutate(
    api = cases_malaria * 1000 / Total
  )

data(Peru, package = "innovar")

malaria_cases_pob_sf <- Peru %>%
  filter(dep == "LORETO") %>%
  select(District = distr, geometry) %>% 
  right_join(
    malaria_cases_pob
  )
figure1 <- ggplot(malaria_cases_pob_sf) +
  geom_sf(aes(fill = api, geometry = geometry)) +
  geom_sf(data = malaria_cases_pob_sf %>% dplyr::filter(District == "BELEN"), colour = "#aa6439", fill = NA, size = 1.5, aes(fill = api, geometry = geometry)) +
  geom_sf(data = malaria_cases_pob_sf %>% dplyr::filter(District == "INDIANA"), colour = "#256e5d", fill = NA, size = 1.5, aes(fill = api, geometry = geometry)) +
  scale_fill_distiller(
    name = "API",
    na.value = "black",
    # limits = c(0, 4000),
    palette = "RdYlGn",
    direction = -1,
    breaks = scales::pretty_breaks(n = 5),
    values = c(
      0,
      0.001,
      0.002,
      0.005,
      0.008,
      0.01,
      0.02,
      0.03,
      0.05,
      0.1,
      0.6,
      0.9,
      1
    )
  ) +
  labs(
    x = NULL,
    y = NULL,
    title = NULL
  ) +
  theme_classic() +
  geom_sf_label_repel(
    data = malaria_cases_pob_sf %>% dplyr::filter(District == "BELEN"),
    aes(label = District),
    min.segment.length = 0,
    force = 100,
    nudge_x = -1,
    seed = 10,
    colour = "#aa6439"
  ) +
  geom_sf_label_repel(
    data = malaria_cases_pob_sf %>% dplyr::filter(District == "INDIANA"),
    aes(label = District),
    min.segment.length = 0,
    force = 100,
    nudge_x = 1,
    seed = 10,
    colour = "#256e5d"
  )

figure1

ggsave(
  "./02_output/plots/figure1.png",
  figure1,
  device = grDevices::png,
  dpi = 300
)

Serological Results

By communities and type of plasmodium/time

# ffi_total %>%
#   ggplot(aes(
#     x = ffi_is_community,
#     fill = pv_historic
#   )) +
#   coord_flip(ylim = c(0, 0.25)) +
#   geom_bar(position = "fill")

plot1 <- ffi_total %>%
  drop_na(pf_recent:pv_historic) %>%
  left_join(
    communities_distances
  )  %>%
  pivot_longer(
    cols = pf_recent:pv_historic,
    names_to = "malaria",
    values_to = "result_malaria"
  ) %>%
  mutate(
    malaria = case_when(
      malaria == "pf_recent" ~ "Recent P. Falciparum",
      malaria == "pf_historic" ~ "Historical P. Falciparum",
      malaria == "pv_recent" ~ "Recent P. Vivax",
      malaria == "pv_historic" ~ "Historical P. Vivax"
    ),
    ffi_is_community = str_to_title(ffi_is_community),
    ffi_is_community = paste0(
      ffi_is_community,
      " (",
      str_to_title(ffi_is_district),
      ")"
    ),
    ffi_is_community = fct_reorder(
      ffi_is_community,
      distance,
      .desc = TRUE
    )
  ) %>%
  ggplot(aes(
    x = ffi_is_community,
    fill = result_malaria
  )) +
  facet_wrap(vars(malaria)) +
  geom_bar(position = "fill", color = "black") +
  coord_flip(ylim = c(0, 0.25)) +
  scale_y_continuous(
    labels = scales::percent_format()
  ) +
  #ggsci::scale_fill_lancet() +
  innovar::scale_fill_innova("npr") +
  labs(
    x = "Communities",
    y = "Percentage"
  ) +
  guides(
    fill = guide_legend("Results")
  ) +  
  theme_minimal() +
  theme(
    strip.text = element_text(
      face = "bold",
      size = 11
    ),
    axis.title = element_text(
      face = "bold",
      size = 11
    ),
    legend.title = element_text(
      face = "bold",
      size = 11
    )
  )

plot1

ggsave(
  "./02_output/plots/plot1_typeofmalaria_communities.png",
  plot1,
  dpi = 300,
  bg = "white",
  width = 10,
  height = 9
)

By communities, Indiana and type of plasmodium/time

plot1_indiana <- ffi_total %>%
  drop_na(pf_recent:pv_historic) %>%
  left_join(
    communities_distances
  )  %>%
  pivot_longer(
    cols = pf_recent:pv_historic,
    names_to = "malaria",
    values_to = "result_malaria"
  ) %>%
  mutate(
    malaria = case_when(
      malaria == "pf_recent" ~ "Recent P. Falciparum",
      malaria == "pf_historic" ~ "Historical P. Falciparum",
      malaria == "pv_recent" ~ "Recent P. Vivax",
      malaria == "pv_historic" ~ "Historical P. Vivax"
    ),
    ffi_is_community = str_to_title(ffi_is_community)
  ) %>%
  filter(ffi_is_district == "INDIANA") %>%
  mutate(
    ffi_is_community = fct_reorder(
      ffi_is_community,
      distance,
      .desc = TRUE
    )
  ) %>%
  ggplot(aes(
    x = ffi_is_community,
    fill = result_malaria
  )) +
  facet_wrap(vars(malaria)) +
  geom_bar(position = "fill", color = "black") +
  coord_flip(ylim = c(0, 0.25)) +
  scale_y_continuous(
    labels = scales::percent_format()
  ) +
  #ggsci::scale_fill_lancet() +
  innovar::scale_fill_innova("npr") +
  labs(
    title = str_wrap("Serological results by plasmodium type of malaria in the Indiana District", 100),
    x = "Communities",
    y = "Percentage"
  ) +
  guides(
    fill = guide_legend("Results")
  ) +  
  theme_minimal() +
  theme(
    strip.text = element_text(
      face = "bold",
      size = 11
    ),
    axis.title = element_text(
      face = "bold",
      size = 11
    ),
    legend.title = element_text(
      face = "bold",
      size = 11
    )
  )

plot1_indiana

ggsave(
  "./02_output/plots/plot1_typeofmalaria_communities_indiana.png",
  plot1_indiana,
  dpi = 300,
  bg = "white",
  width = 10,
  height = 9
)

By communities, Belen and type of plasmodium/time

plot1_belen <- ffi_total %>%
  drop_na(pf_recent:pv_historic) %>%
  left_join(
    communities_distances
  ) %>%
  pivot_longer(
    cols = pf_recent:pv_historic,
    names_to = "malaria",
    values_to = "result_malaria"
  ) %>%
  filter(ffi_is_district == "BELEN") %>%
  mutate(
    malaria = case_when(
      malaria == "pf_recent" ~ "Recent P. Falciparum",
      malaria == "pf_historic" ~ "Historical P. Falciparum",
      malaria == "pv_recent" ~ "Recent P. Vivax",
      malaria == "pv_historic" ~ "Historical P. Vivax"
    ),
    ffi_is_community = str_to_title(ffi_is_community),
    ffi_is_community = fct_reorder(
      ffi_is_community,
      distance,
      .desc = TRUE
    )
  ) %>%
  ggplot(aes(
    x = ffi_is_community,
    fill = result_malaria
  )) +
  facet_wrap(vars(malaria)) +
  geom_bar(position = "fill", color = "black") +
  coord_flip(ylim = c(0, 0.25)) +
  scale_y_continuous(
    labels = scales::percent_format()
  ) +
  #ggsci::scale_fill_lancet() +
  innovar::scale_fill_innova("npr") +
  labs(
    title = str_wrap("Serological results by plasmodium type of malaria in the Belen District", 100),
    x = "Communities",
    y = "Percentage"
  ) +
  guides(
    fill = guide_legend("Results")
  ) +  
  theme_minimal() +
  theme(
    strip.text = element_text(
      face = "bold",
      size = 11
    ),
    axis.title = element_text(
      face = "bold",
      size = 11
    ),
    legend.title = element_text(
      face = "bold",
      size = 11
    )
  )

plot1_belen

ggsave(
  "./02_output/plots/plot1_typeofmalaria_communities_belen.png",
  plot1_belen,
  dpi = 300,
  bg = "white",
  width = 10,
  height = 9
)

By communities, type of plasmodium exposure

plot2 <- ffi_total %>%
  drop_na(pf_exposure, pv_exposure) %>%
  left_join(
    communities_distances
  ) %>%
  pivot_longer(
    cols = pv_exposure:pf_exposure,
    names_to = "exposure",
    values_to = "result_exposure"
  )  %>%
  mutate(
    exposure = case_when(
         exposure == "pv_exposure" ~ "P. Vivax Exposure",
         exposure == "pf_exposure" ~ "P. Falciparum Exposure"
    ),
    ffi_is_community = str_to_title(ffi_is_community),
    ffi_is_community = fct_reorder(
      ffi_is_community,
      distance,
      .desc = TRUE
    )
  ) %>%
  ggplot(aes(
    x = ffi_is_community,
    fill = result_exposure
  )) +
  facet_wrap(vars(exposure)) +
  geom_bar(position = "fill", color = "black") +
  coord_flip(ylim = c(0, 0.40)) +
  scale_y_continuous(
    labels = scales::percent_format()
  ) +
  # ggsci::scale_fill_lancet() +
  innovar::scale_fill_innova("npr") +
  labs(
    x = "Communities",
    y = "Percentage"
  ) +
  guides(
    fill = guide_legend("Results")
  ) +
  theme_minimal() +
  theme(
    strip.text = element_text(
      face = "bold",
      size = 11
    ),
    axis.title = element_text(
      face = "bold",
      size = 11
    ),
    legend.title = element_text(
      face = "bold",
      size = 11
    )
  )

plot2

ggsave(
  "./02_output/plots/plot2_typeofmalaria_communities.png",
  plot2,
  dpi = 300,
  bg = "white",
  width = 10,
  height = 9
)

By communities, time of plasmodium exposure

plot3 <- ffi_total %>%
  drop_na(recent_exposure, historical_exposure) %>%
  left_join(
    communities_distances
  ) %>%
  pivot_longer(
    cols = recent_exposure:historical_exposure,
    names_to = "exposure",
    values_to = "result_exposure"
  ) %>%
  mutate(
    exposure = case_when(
      exposure == "recent_exposure" ~ "Recent Exposure",
      exposure == "historical_exposure" ~ "Historical Exposure"
    ),
    ffi_is_community = str_to_title(ffi_is_community),
    ffi_is_community = fct_reorder(
      ffi_is_community,
      distance,
      .desc = TRUE
    )
  ) %>%
  ggplot(aes(
    x = ffi_is_community,
    fill = result_exposure
  )) +
  facet_wrap(vars(exposure)) +
  geom_bar(position = "fill", color = "black") +
  coord_flip(ylim = c(0, 0.30)) +
  scale_y_continuous(
    labels = scales::percent_format()
  ) +
  # ggsci::scale_fill_lancet() +
  innovar::scale_fill_innova("npr") +
  labs(
    x = "Communities",
    y = "Percentage"
  ) +
  guides(
    fill = guide_legend("Results")
  ) +
  theme_minimal() +
  theme(
    strip.text = element_text(
      face = "bold",
      size = 11
    ),
    axis.title = element_text(
      face = "bold",
      size = 11
    ),
    legend.title = element_text(
      face = "bold",
      size = 11
    )
  )

plot3

ggsave(
  "./02_output/plots/plot3_typeofmalaria_communities.png",
  plot3,
  dpi = 300,
  bg = "white",
  width = 10,
  height = 9
)
# ffi_total %>%
#   drop_na(pf_recent:pv_historic, age_cat) %>%
#   pivot_longer(
#     cols = pf_recent:pv_historic,
#     names_to = "malaria",
#     values_to = "result_malaria"
#   ) %>%
#   mutate(
#     result_malaria = case_when(
#       result_malaria == "Positive" ~ 1,
#       TRUE ~ 0
#     ),
#     malaria = case_when(
#       malaria == "pf_recent" ~ "Recent P. Falciparum",
#       malaria == "pf_historic" ~ "Historical P. Falciparum",
#       malaria == "pv_recent" ~ "Recent P. Vivax",
#       malaria == "pv_historic" ~ "Historical P. Vivax"
#     ),
#     ffi_is_community = str_to_title(ffi_is_community)
#   ) %>%
#   group_by(ffi_is_community, age_cat, malaria) %>%
#   summarise(result_malaria = mean(result_malaria)) %>%
#   ggplot(
#     aes(
#       x = age_cat,
#       y = result_malaria,
#       color = malaria,
#       group = malaria
#     )
#   ) +
#   geom_point() +
#   geom_line() +
#   facet_wrap(vars(ffi_is_community)) +
#   theme_bw()

Seropositivity 4 malaria

By district

sero_4malaria_district <- ffi_total %>%
  drop_na(pf_recent:pv_historic, age_cat) %>%
  pivot_longer(
    cols = pf_recent:pv_historic,
    names_to = "malaria",
    values_to = "result_malaria"
  ) %>%
  mutate(
    result_malaria = case_when(
      result_malaria == "Positive" ~ 1,
      TRUE ~ 0
    ),
    malaria = case_when(
      malaria == "pf_recent" ~ "Recent P. Falciparum",
      malaria == "pf_historic" ~ "Historical P. Falciparum",
      malaria == "pv_recent" ~ "Recent P. Vivax",
      malaria == "pv_historic" ~ "Historical P. Vivax"
    ),
    across(
      c(ffi_is_community:ffi_is_health_facility_name),
      str_to_title
    )
  ) %>%
  group_by(ffi_is_district, age_cat, malaria) %>%
  summarise(result_malaria = mean(result_malaria)) %>%
  ggplot(
    aes(
      x = age_cat,
      y = result_malaria,
      color = malaria,
      group = malaria
    )
  ) +
  geom_point() +
  geom_line() +
  facet_wrap(vars(ffi_is_district)) +
  scale_y_continuous(
    labels = scales::percent_format(),
    limits = c(0, 0.40)
  ) +
  labs(
    x = "Age",
    y = "Seropositivity"
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") +
  theme_bw()

sero_4malaria_district

ggsave(
  "./02_output/plots/plot4_sero_4malaria_district.png",
  sero_4malaria_district,
  dpi = 300,
  bg = "white",
  width = 12,
  height = 7.5
)

By Health Facility

sero_4malaria_hf <- ffi_total %>%
  drop_na(pf_recent:pv_historic, age_cat) %>%
  pivot_longer(
    cols = pf_recent:pv_historic,
    names_to = "malaria",
    values_to = "result_malaria"
  ) %>%
  mutate(
    result_malaria = case_when(
      result_malaria == "Positive" ~ 1,
      TRUE ~ 0
    ),
    malaria = case_when(
      malaria == "pf_recent" ~ "Recent P. Falciparum",
      malaria == "pf_historic" ~ "Historical P. Falciparum",
      malaria == "pv_recent" ~ "Recent P. Vivax",
      malaria == "pv_historic" ~ "Historical P. Vivax"
    ),
    across(
      c(ffi_is_community:ffi_is_health_facility_name),
      str_to_title
    ),
    ffi_is_health_facility_name = paste(
      ffi_is_district,
      ffi_is_health_facility_name,
      sep = " - "
    )
  ) %>%
  group_by(ffi_is_health_facility_name, age_cat, malaria) %>%
  summarise(result_malaria = mean(result_malaria)) %>%
  ggplot(
    aes(
      x = age_cat,
      y = result_malaria,
      color = malaria,
      group = malaria
    )
  ) +
  geom_point() +
  geom_line() +
  facet_wrap(vars(ffi_is_health_facility_name)) +
  scale_y_continuous(
    labels = scales::percent_format()
  ) +
  labs(
    x = "Age",
    y = "Seropositivity"
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") + 
  theme_bw() +
  theme(
    axis.text.x = element_text(
      angle = 45,
      vjust = 1,
      hjust = 1
    )
  )
  
sero_4malaria_hf

ggsave(
  "./02_output/plots/plot5_sero_4malaria_hf.png",
  sero_4malaria_hf,
  dpi = 300,
  bg = "white",
  width = 10,
  height = 7
)

Seopositivity by Type of Malaria

By District

ffi_typeof_malaria <- ffi_total %>%
  drop_na(pf_exposure, pv_exposure, age_cat) %>%
  pivot_longer(
    cols = pv_exposure:pf_exposure,
    names_to = "exposure",
    values_to = "result_exposure"
  ) %>%
  mutate(
    exposure = case_when(
      exposure == "pv_exposure" ~ "P. Vivax Exposure",
      exposure == "pf_exposure" ~ "P. Falciparum Exposure"
    ),
    result_exposure = case_when(
      result_exposure == "Positive" ~ 1,
      TRUE ~ 0
    ),
    across(
      c(ffi_is_community:ffi_is_health_facility_name),
      str_to_title
    )
  )

sero_typeofmalaria_district <- ffi_typeof_malaria %>%
  group_by(ffi_is_district, age_cat, exposure) %>%
  summarise(result_exposure = mean(result_exposure)) %>%
  ggplot(
    aes(
      x = age_cat,
      y = result_exposure,
      color = exposure,
      group = exposure
    )
  ) +
  geom_point() +
  geom_line() +
  facet_wrap(vars(ffi_is_district)) +
  scale_y_continuous(
    labels = scales::percent_format(),
    limits = c(0, 0.40)
  ) +
  labs(
    x = "Age",
    y = "Seropositivity"
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") +
  theme_bw()
ggsave(
  "./02_output/plots/plot6_sero_typeofmalaria_district.png",
  sero_typeofmalaria_district,
  dpi = 300,
  bg = "white",
  width = 12,
  height = 7.5
)

By Health Facility

sero_typeofmalaria_hf <- ffi_typeof_malaria %>%
  group_by(ffi_is_health_facility_name, age_cat, exposure) %>%
  summarise(result_exposure = mean(result_exposure)) %>%
  ggplot(
    aes(
      x = age_cat,
      y = result_exposure,
      color = exposure,
      group = exposure
    )
  ) +
  geom_point() +
  geom_line() +
  facet_wrap(vars(ffi_is_health_facility_name)) +
  scale_y_continuous(
    labels = scales::percent_format()
  ) +
  labs(
    x = "Age",
    y = "Seropositivity"
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") +
  theme_bw()

sero_typeofmalaria_hf

ggsave(
  "./02_output/plots/plot7_sero_typeofmalaria_hf.png",
  sero_typeofmalaria_hf,
  dpi = 300,
  bg = "white",
  width = 13,
  height = 9
)

Seropositivity by Time of Exposure

By District

ffi_timeofmalaria <- ffi_total %>%
  drop_na(recent_exposure, historical_exposure, age_cat) %>%
  pivot_longer(
    cols = recent_exposure:historical_exposure,
    names_to = "exposure",
    values_to = "result_exposure"
  ) %>%
  mutate(
    exposure = case_when(
      exposure == "recent_exposure" ~ "Recent Exposure",
      exposure == "historical_exposure" ~ "Historical Exposure"
    ),
    result_exposure = case_when(
      result_exposure == "Positive" ~ 1,
      TRUE ~ 0
    ),
    across(
      c(ffi_is_community:ffi_is_health_facility_name),
      str_to_title
    )
  )

sero_timeofmalaria_district <- ffi_timeofmalaria %>%
  group_by(ffi_is_district, age_cat, exposure) %>%
  summarise(result_exposure = mean(result_exposure)) %>%
  ggplot(
    aes(
      x = age_cat,
      y = result_exposure,
      color = exposure,
      group = exposure
    )
  ) +
  geom_point() +
  geom_line() +
  facet_wrap(vars(ffi_is_district)) +
  scale_y_continuous(
    labels = scales::percent_format(),
    limits = c(0, 0.40)
  ) +
  labs(
    x = "Age",
    y = "Seropositivity"
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") +
  theme_bw()
ggsave(
  "./02_output/plots/plot8_sero_timeofmalaria_district.png",
  sero_timeofmalaria_district,
  dpi = 300,
  bg = "white",
  width = 12,
  height = 7.5
)

By Health Facility

sero_timeofmalaria_hf <- ffi_timeofmalaria %>%
  group_by(ffi_is_health_facility_name, age_cat, exposure) %>%
  summarise(result_exposure = mean(result_exposure)) %>%
  ggplot(
    aes(
      x = age_cat,
      y = result_exposure,
      color = exposure,
      group = exposure
    )
  ) +
  geom_point() +
  geom_line() +
  facet_wrap(vars(ffi_is_health_facility_name)) +
  scale_y_continuous(
    labels = scales::percent_format()
  ) +
  labs(
    x = "Age",
    y = "Seropositivity"
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") + 
  theme_bw()
  
sero_timeofmalaria_hf

ggsave(
  "./02_output/plots/plot9_sero_timeofmalaria_hf.png",
  sero_timeofmalaria_hf,
  dpi = 300,
  bg = "white",
  width = 13,
  height = 9
)

Relation with sex

library(rlang)

seropositivy_summarise <- function(data, type, variable, ...) {
  if (type == "4malaria") {
    ffi_total %>%
      drop_na(pf_recent:pv_historic, {{ variable }}, ...) %>%
      pivot_longer(
        cols = pf_recent:pv_historic,
        names_to = "malaria",
        values_to = "result_malaria"
      ) %>%
      mutate(
        result_malaria = case_when(
          result_malaria == "Positive" ~ 1,
          TRUE ~ 0
        ),
        malaria = case_when(
          malaria == "pf_recent" ~ "Recent P. Falciparum",
          malaria == "pf_historic" ~ "Historical P. Falciparum",
          malaria == "pv_recent" ~ "Recent P. Vivax",
          malaria == "pv_historic" ~ "Historical P. Vivax"
        ),
        across(
          c(ffi_is_community:ffi_is_health_facility_name),
          str_to_title
        )
      ) %>%
      group_by(ffi_is_district, {{ variable }}, ..., malaria) %>%
      summarise(result_malaria = mean(result_malaria))
  } else if (type == "typeofmalaria" ) {
    ffi_total %>%
      drop_na(pf_exposure, pv_exposure, {{ variable }}, ...) %>%
      pivot_longer(
        cols = pv_exposure:pf_exposure,
        names_to = "exposure",
        values_to = "result_exposure"
      ) %>%
      mutate(
        exposure = case_when(
          exposure == "pv_exposure" ~ "P. Vivax Exposure",
          exposure == "pf_exposure" ~ "P. Falciparum Exposure"
        ),
        result_exposure = case_when(
          result_exposure == "Positive" ~ 1,
          TRUE ~ 0
        ),
        across(
          c(ffi_is_community:ffi_is_health_facility_name),
          str_to_title
        )
      ) %>%
      group_by(ffi_is_district, {{ variable }}, ..., exposure) %>%
      summarise(result_exposure = mean(result_exposure))
  } else if (type == "timeofmalaria") {
    ffi_total %>%
      drop_na(recent_exposure, historical_exposure, 
              {{ variable }}, ...) %>%
      pivot_longer(
        cols = recent_exposure:historical_exposure,
        names_to = "exposure",
        values_to = "result_exposure"
      ) %>%
      mutate(
        exposure = case_when(
          exposure == "recent_exposure" ~ "Recent Exposure",
          exposure == "historical_exposure" ~ "Historical Exposure"
        ),
        result_exposure = case_when(
          result_exposure == "Positive" ~ 1,
          TRUE ~ 0
        ),
        across(
          c(ffi_is_community:ffi_is_health_facility_name),
          str_to_title
        )
      ) %>%
      group_by(ffi_is_district, {{ variable }}, ..., exposure) %>%
      summarise(result_exposure = mean(result_exposure))      
  }  
}

By 4 Malaria

sero_4malaria_district_gender <- seropositivy_summarise(
  ffi_total,
  "4malaria",
  age_cat,
  gender
) %>%
  ggplot(
    aes(
      x = age_cat,
      y = result_malaria,
      color = malaria,
      group = malaria
    )
  ) +
  geom_point() +
  geom_line() +
  facet_grid(
    vars(gender),
    vars(ffi_is_district)    
  ) +
  scale_y_continuous(
    labels = scales::percent_format(),
    limits = c(0, 0.40)
  ) +
  labs(
    x = "Age",
    y = "Seropositivity"
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") +
  theme_bw()

sero_4malaria_district_gender

ggsave(
  "./02_output/plots/plot10_sero_4malaria_district_gender.png",
  sero_4malaria_district_gender,
  dpi = 300,
  bg = "white",
  width = 12,
  height = 8.5
)

By Type of Malaria

sero_typeofmalaria_district_gender <- seropositivy_summarise(
  ffi_total,
  "typeofmalaria",
  age_cat,
  gender
) %>%
  ggplot(
    aes(
      x = age_cat,
      y = result_exposure,
      color = exposure,
      group = exposure
    )
  ) +
  geom_point() +
  geom_line() +
  facet_grid(
    vars(gender),
    vars(ffi_is_district)    
  ) +
  scale_y_continuous(
    labels = scales::percent_format(),
    limits = c(0, 0.45)
  ) +
  labs(
    x = "Age",
    y = "Seropositivity"
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") +
  theme_bw()

sero_typeofmalaria_district_gender

ggsave(
  "./02_output/plots/plot11_sero_typeofmalaria_district_gender.png",
  sero_typeofmalaria_district_gender,
  dpi = 300,
  bg = "white",
  width = 12,
  height = 8.5
)

By Time of Malaria

sero_timeofmalaria_district_gender <- seropositivy_summarise(
  ffi_total,
  "timeofmalaria",
  age_cat,
  gender
) %>%
  ggplot(
    aes(
      x = age_cat,
      y = result_exposure,
      color = exposure,
      group = exposure
    )
  ) +
  geom_point() +
  geom_line() +
  facet_grid(
    vars(gender),
    vars(ffi_is_district)    
  ) +
  scale_y_continuous(
    labels = scales::percent_format(),
    limits = c(0, 0.45)
  ) +
  labs(
    x = "Age",
    y = "Seropositivity"
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") +
  theme_bw()

sero_timeofmalaria_district_gender

ggsave(
  "./02_output/plots/plot12_sero_timeofmalaria_district_gender.png",
  sero_timeofmalaria_district_gender,
  dpi = 300,
  bg = "white",
  width = 12,
  height = 8.5
)

Relation with Education Level

By 4 Malaria

sero_4malaria_district_edulevel <- seropositivy_summarise(
  ffi_total,
  "4malaria",
  age_cat,
  education_level
) %>%
  ggplot(
    aes(
      x = age_cat,
      y = result_malaria,
      color = malaria,
      group = malaria
    )
  ) +
  geom_point() +
  geom_line() +
  facet_grid(
    vars(education_level),
    vars(ffi_is_district)    
  ) +
  scale_y_continuous(
    labels = scales::percent_format(),
    #limits = c(0, 0.40)
  ) +
  labs(
    x = "Age",
    y = "Seropositivity"
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") +
  theme_bw()

sero_4malaria_district_edulevel

ggsave(
  "./02_output/plots/plot13_sero_4malaria_district_edulevel.png",
  sero_4malaria_district_edulevel,
  dpi = 300,
  bg = "white",
  width = 12,
  height = 8.5
)

By Type of Malaria

sero_typeofmalaria_district_edulevel <- seropositivy_summarise(
  ffi_total,
  "typeofmalaria",
  age_cat,
  education_level
) %>%
  ggplot(
    aes(
      x = age_cat,
      y = result_exposure,
      color = exposure,
      group = exposure
    )
  ) +
  geom_point() +
  geom_line() +
  facet_grid(
    vars(education_level),
    vars(ffi_is_district)    
  ) +
  scale_y_continuous(
    labels = scales::percent_format(),
    #limits = c(0, 0.45)
  ) +
  labs(
    x = "Age",
    y = "Seropositivity"
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") +
  theme_bw()

sero_typeofmalaria_district_edulevel

ggsave(
  "./02_output/plots/plot14_sero_typeofmalaria_district_edulevel.png",
  sero_typeofmalaria_district_edulevel,
  dpi = 300,
  bg = "white",
  width = 12,
  height = 8.5
)

By Time of Malaria

sero_timeofmalaria_district_edulevel <- seropositivy_summarise(
  ffi_total,
  "timeofmalaria",
  age_cat,
  education_level
) %>%
  ggplot(
    aes(
      x = age_cat,
      y = result_exposure,
      color = exposure,
      group = exposure
    )
  ) +
  geom_point() +
  geom_line() +
  facet_grid(
    vars(education_level),
    vars(ffi_is_district)    
  ) +
  scale_y_continuous(
    labels = scales::percent_format(),
    #limits = c(0, 0.45)
  ) +
  labs(
    x = "Age",
    y = "Seropositivity"
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") +
  theme_bw()

sero_timeofmalaria_district_edulevel

ggsave(
  "./02_output/plots/plot15_sero_timeofmalaria_district_edulevel.png",
  sero_timeofmalaria_district_edulevel,
  dpi = 300,
  bg = "white",
  width = 12,
  height = 8.5
)

Relation with Fever Month

By 4 malaria

ffi_fever_month <- ffi_total %>%
  drop_na(pf_recent:pv_historic, age_cat, ffi_is_fever_month) %>%
  pivot_longer(
    cols = pf_recent:pv_historic,
    names_to = "malaria",
    values_to = "result_malaria"
  ) %>%
  mutate(
    result_malaria = case_when(
      result_malaria == "Positive" ~ 1,
      TRUE ~ 0
    ),
    malaria = case_when(
      malaria == "pf_recent" ~ "Recent P. Falciparum",
      malaria == "pf_historic" ~ "Historical P. Falciparum",
      malaria == "pv_recent" ~ "Recent P. Vivax",
      malaria == "pv_historic" ~ "Historical P. Vivax"
    ),
    across(
      c(ffi_is_community:ffi_is_health_facility_name),
      str_to_title
    )
  ) %>%
  group_by(ffi_is_fever_month, age_cat, malaria) %>%
  summarise(result_malaria = mean(result_malaria))


sero_4malaria_fever_month <- ffi_fever_month %>%
  ggplot(
    aes(
      x = result_malaria,
      y = age_cat,
      group = age_cat
    )
  ) +
  geom_path(
    color = "#bdbdbd"
  ) +
  geom_point(
    aes(color = malaria),
    size = 3
  ) +
  facet_wrap(vars(ffi_is_fever_month)) +
  scale_x_continuous(
    labels = scales::percent_format(),
    #limits = c(0, 0.5)
  ) +
  labs(
    y = "Age",
    x = "Seropositivity",
    title = str_wrap("Malaria seropositivity by type of exposure, plasmodium and presence of fever in the last month", 100)
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") +
  theme_bw()
ggsave(
  "./02_output/plots/plot16_sero_4malaria_fevermonth.png",
  sero_4malaria_fever_month,
  dpi = 300,
  bg = "white",
  width = 12,
  height = 8.5
)

By Type of Malaria

ffi_fever_month_typeofmalaria <- ffi_total %>%
  drop_na(pf_recent:pv_historic, age_cat, ffi_is_fever_month) %>%
  pivot_longer(
    cols = pv_exposure:pf_exposure,
    names_to = "exposure",
    values_to = "result_exposure"
  ) %>%
    mutate(
      exposure = case_when(
        exposure == "pv_exposure" ~ "P. Vivax Exposure",
        exposure == "pf_exposure" ~ "P. Falciparum Exposure"
      ),
      result_exposure = case_when(
        result_exposure == "Positive" ~ 1,
        TRUE ~ 0
      ),
      across(
        c(ffi_is_community:ffi_is_health_facility_name),
        str_to_title
      )
    ) %>%
    group_by(ffi_is_fever_month, age_cat, exposure) %>%
    summarise(result_exposure = mean(result_exposure))

sero_typeofmalaria_fever_month <- ffi_fever_month_typeofmalaria %>%
  ggplot(
    aes(
      x = result_exposure,
      y = age_cat,
      group = age_cat
    )
  ) +
  geom_path(
    color = "#bdbdbd"
  ) +
  geom_point(
    aes(color = exposure),
    size = 3
  ) +
  facet_wrap(vars(ffi_is_fever_month)) +
  scale_x_continuous(
    labels = scales::percent_format(),
    # limits = c(0, 0.5)
  ) +
  labs(
    y = "Age",
    x = "Seropositivity",
    title = str_wrap("Malaria seropositivity by type of plasmodium and presence of fever in the last month", 100)
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") +
  theme_bw()
ggsave(
  "./02_output/plots/plot16_sero_typeofmalaria_fevermonth.png",
  sero_typeofmalaria_fever_month,
  dpi = 300,
  bg = "white",
  width = 12,
  height = 8.5
)

By Time of Malaria

ffi_fever_month_timeofmalaria <- ffi_total %>%
  drop_na(pf_recent:pv_historic, age_cat, ffi_is_fever_month) %>%
  pivot_longer(
    cols = recent_exposure:historical_exposure,
    names_to = "exposure",
    values_to = "result_exposure"
  ) %>%
  mutate(
    exposure = case_when(
      exposure == "recent_exposure" ~ "Recent Exposure",
      exposure == "historical_exposure" ~ "Historical Exposure"
    ),
    result_exposure = case_when(
      result_exposure == "Positive" ~ 1,
      TRUE ~ 0
    ),
    across(
      c(ffi_is_community:ffi_is_health_facility_name),
      str_to_title
    )
  ) %>%
  group_by(ffi_is_fever_month, age_cat, exposure) %>%
  summarise(result_exposure = mean(result_exposure))

sero_timeofmalaria_fever_month <- ffi_fever_month_typeofmalaria %>%
  ggplot(
    aes(
      x = result_exposure,
      y = age_cat,
      group = age_cat
    )
  ) +
  geom_path(
    color = "#bdbdbd"
  ) +
  geom_point(
    aes(color = exposure),
    size = 3
  ) +
  facet_wrap(vars(ffi_is_fever_month)) +
  scale_x_continuous(
    labels = scales::percent_format(),
    # limits = c(0, 0.5)
  ) +
  labs(
    y = "Age",
    x = "Seropositivity",
    title = str_wrap("Malaria seropositivity by time of plasmodium and presence of fever in the last month", 100)
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") +
  theme_bw()
ggsave(
  "./02_output/plots/plot16_sero_timeofmalaria_fevermonth.png",
  sero_timeofmalaria_fever_month,
  dpi = 300,
  bg = "white",
  width = 12,
  height = 8.5
)

Relation with Antimalarial Drugs

By 4 Malaria

sero_4malaria_district_antimaldrugs <- seropositivy_summarise(
  ffi_total,
  "4malaria",
  age_cat,
  ffi_is_antimal_drug_use
) %>%
  ggplot(
    aes(
      x = age_cat,
      y = result_malaria,
      color = malaria,
      group = malaria
    )
  ) +
  geom_point() +
  geom_line() +
  facet_grid(
    vars(ffi_is_antimal_drug_use),
    vars(ffi_is_district)    
  ) +
  scale_y_continuous(
    labels = scales::percent_format(),
    limits = c(0, 0.50)
  ) +
  labs(
    x = "Age",
    y = "Seropositivity"
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") +
  theme_bw()

sero_4malaria_district_antimaldrugs

ggsave(
  "./02_output/plots/plot19_sero_4malaria_district_antimaldrugs.png",
  sero_4malaria_district_antimaldrugs,
  dpi = 300,
  bg = "white",
  width = 12,
  height = 8.5
)

By Type of Malaria

sero_typeofmalaria_district_antimaldrugs <- seropositivy_summarise(
  ffi_total,
  "typeofmalaria",
  age_cat,
  ffi_is_antimal_drug_use
) %>%
  ggplot(
    aes(
      x = age_cat,
      y = result_exposure,
      color = exposure,
      group = exposure
    )
  ) +
  geom_point() +
  geom_line() +
  facet_grid(
    vars(ffi_is_antimal_drug_use),
    vars(ffi_is_district)    
  ) +
  scale_y_continuous(
    labels = scales::percent_format(),
    limits = c(0, 0.60)
  ) +
  labs(
    x = "Age",
    y = "Seropositivity"
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") +
  theme_bw()

sero_typeofmalaria_district_antimaldrugs

ggsave(
  "./02_output/plots/plot20_sero_typeofmalaria_district_antimaldrugs.png",
  sero_typeofmalaria_district_antimaldrugs,
  dpi = 300,
  bg = "white",
  width = 12,
  height = 8.5
)

By Time of Malaria

sero_timeofmalaria_district_antimaldrugs <- seropositivy_summarise(
  ffi_total,
  "timeofmalaria",
  age_cat,
  ffi_is_antimal_drug_use
) %>%
  ggplot(
    aes(
      x = age_cat,
      y = result_exposure,
      color = exposure,
      group = exposure
    )
  ) +
  geom_point() +
  geom_line() +
  facet_grid(
    vars(ffi_is_antimal_drug_use),
    vars(ffi_is_district)    
  ) +
  scale_y_continuous(
    labels = scales::percent_format(),
    limits = c(0, 0.5)
  ) +
  labs(
    x = "Age",
    y = "Seropositivity"
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") +
  theme_bw()

sero_timeofmalaria_district_antimaldrugs

ggsave(
  "./02_output/plots/plot21_sero_timeofmalaria_district_antimaldrugs.png",
  sero_timeofmalaria_district_antimaldrugs,
  dpi = 300,
  bg = "white",
  width = 12,
  height = 8.5
)

Relation with time of someone had malaria

By general malaria

ffi_4malaria_mal_lifetime <- ffi_total %>% 
  drop_na(only_pv_exposure:freedom_malaria, 
          age_code, ffi_is_mal_lifetime) %>% 
  pivot_longer(
    cols = only_pv_exposure:freedom_malaria,
    names_to = "malaria",
    values_to = "result_malaria"
  ) %>% 
  mutate(
    result_malaria = case_when(
      result_malaria == "Positive" ~ 1,
      TRUE ~ 0
    ),
    malaria = case_when(
      malaria == "only_pv_exposure" ~ "Only P. vivax",
      malaria == "only_pf_exposure" ~ "Only P. falciparum",
      malaria == "pv_pf_exposure" ~ "P. vivax & falciparum Exposure",
      malaria == "freedom_malaria" ~ "Freedom from Malaria"
    ),
    across(
      c(ffi_is_community:ffi_is_health_facility_name),
      str_to_title
    )
  ) %>%
  group_by(ffi_is_mal_lifetime, age_code, malaria) %>%
  summarise(result_malaria = mean(result_malaria))

sero_4malaria_mal_lifetime <- ffi_4malaria_mal_lifetime %>%
  ggplot(
    aes(
      x = age_code,
      y = result_malaria,
      fill = malaria
    )
  ) +
  geom_area() +
  scale_x_continuous(
    limits = c(1, 8),
    breaks = seq(1, 8, 1),
    labels = c(
      "[0-10)",
      "[10-20)",
      "[20-30)",
      "[30-40)",
      "[40-50)",
      "[50-60)",
      "[60-70)",
      "[70+)"
    ),
    expand = c(0, 0)
  ) +
  scale_y_continuous(
    labels = scales::percent_format(),
    expand = c(0, 0)
  ) +
  facet_wrap(vars(ffi_is_mal_lifetime)) +
  labs(
    y = "Seropositivity",
    x = "Age",
    title = str_wrap("Malaria seropositivity by type of exposure, plasmodium and how many times they think they have had malaria", 100)
  ) +
  guides(
    fill = guide_legend("Malaria")
  ) +
  innovar::scale_fill_innova("npr") +
  theme_bw() +
  theme(
    axis.text.x = element_text(
      angle = 45,
      vjust = 1,
      hjust = 1
    ),
    panel.spacing = unit(1, "lines")
  )

sero_4malaria_mal_lifetime

ggsave(
  "./02_output/plots/plot22_sero_4ofmalaria_mal_lifetime.png",
  sero_4malaria_mal_lifetime,
  dpi = 300,
  bg = "white",
  width = 11,
  height = 5
)

By Recent Malaria

ffi_recentmalaria_mal_lifetime <- ffi_total %>% 
  drop_na(only_pv_recent:freedom_malaria_recent, 
          age_code, ffi_is_mal_lifetime) %>% 
  pivot_longer(
    cols = only_pv_recent:freedom_malaria_recent,
    names_to = "malaria",
    values_to = "result_malaria"
  ) %>% 
  mutate(
    result_malaria = case_when(
      result_malaria == "Positive" ~ 1,
      TRUE ~ 0
    ),
    malaria = case_when(
      malaria == "only_pv_recent" ~ "Only P. vivax Recent",
      malaria == "only_pf_recent" ~ "Only P. falciparum Recent",
      malaria == "pv_pf_recent" ~ "P. vivax & falciparum Recent",
      malaria == "freedom_malaria_recent" ~ "Freedom from Malaria Recent"
    ),
    across(
      c(ffi_is_community:ffi_is_health_facility_name),
      str_to_title
    )
  ) %>%
  group_by(ffi_is_mal_lifetime, age_code, malaria) %>%
  summarise(result_malaria = mean(result_malaria))

sero_recentmalaria_mal_lifetime <- ffi_recentmalaria_mal_lifetime %>%
  ggplot(
    aes(
      x = age_code,
      y = result_malaria,
      fill = malaria
    )
  ) +
  geom_area() +
  scale_x_continuous(
    limits = c(1, 8),
    breaks = seq(1, 8, 1),
    labels = c(
      "[0-10)",
      "[10-20)",
      "[20-30)",
      "[30-40)",
      "[40-50)",
      "[50-60)",
      "[60-70)",
      "[70+)"
    ),
    expand = c(0, 0)
  ) +
  scale_y_continuous(
    labels = scales::percent_format(),
    expand = c(0, 0)
  ) +
  facet_wrap(vars(ffi_is_mal_lifetime)) +
  labs(
    y = "Seropositivity",
    x = "Age",
    title = str_wrap("Malaria seropositivity by recent exposure and how many times they think they have had malaria", 100)
  ) +
  guides(
    fill = guide_legend("Malaria")
  ) +
  innovar::scale_fill_innova("npr") +
  theme_bw() +
  theme(
    axis.text.x = element_text(
      angle = 45,
      vjust = 1,
      hjust = 1
    ),
    panel.spacing = unit(1, "lines")
  )

sero_recentmalaria_mal_lifetime

ggsave(
  "./02_output/plots/plot23_sero_recent_malaria_mal_lifetime.png",
  sero_recentmalaria_mal_lifetime,
  dpi = 300,
  bg = "white",
  width = 11,
  height = 5
)

By Historic Malaria

ffi_historicmalaria_mal_lifetime <- ffi_total %>% 
  drop_na(only_pv_historic:freedom_malaria_historic, 
          age_code, ffi_is_mal_lifetime) %>% 
  pivot_longer(
    cols = only_pv_historic:freedom_malaria_historic,
    names_to = "malaria",
    values_to = "result_malaria"
  ) %>% 
  mutate(
    result_malaria = case_when(
      result_malaria == "Positive" ~ 1,
      TRUE ~ 0
    ),
    malaria = case_when(
      malaria == "only_pv_historic" ~ "Only P. vivax Historic",
      malaria == "only_pf_historic" ~ "Only P. falciparum Historic",
      malaria == "pv_pf_historic" ~ "P. vivax & falciparum Historic",
      malaria == "freedom_malaria_historic" ~ "Freedom from Malaria Historic"
    ),
    across(
      c(ffi_is_community:ffi_is_health_facility_name),
      str_to_title
    )
  ) %>%
  group_by(ffi_is_mal_lifetime, age_code, malaria) %>%
  summarise(result_malaria = mean(result_malaria))

sero_historicmalaria_mal_lifetime <- ffi_historicmalaria_mal_lifetime %>%
  ggplot(
    aes(
      x = age_code,
      y = result_malaria,
      fill = malaria
    )
  ) +
  geom_area() +
  scale_x_continuous(
    limits = c(1, 8),
    breaks = seq(1, 8, 1),
    labels = c(
      "[0-10)",
      "[10-20)",
      "[20-30)",
      "[30-40)",
      "[40-50)",
      "[50-60)",
      "[60-70)",
      "[70+)"
    ),
    expand = c(0, 0)
  ) +
  scale_y_continuous(
    labels = scales::percent_format(),
    expand = c(0, 0)
  ) +
  facet_wrap(vars(ffi_is_mal_lifetime)) +
  labs(
    y = "Seropositivity",
    x = "Age",
    title = str_wrap("Malaria seropositivity by historic exposure and how many times they think they have had malaria", 100)
  ) +
  guides(
    fill = guide_legend("Malaria")
  ) +
  innovar::scale_fill_innova("npr") +
  theme_bw() +
  theme(
    axis.text.x = element_text(
      angle = 45,
      vjust = 1,
      hjust = 1
    ),
    panel.spacing = unit(1, "lines")
  )

sero_historicmalaria_mal_lifetime

ggsave(
  "./02_output/plots/plot24_sero_historic_malaria_mal_lifetime.png",
  sero_historicmalaria_mal_lifetime,
  dpi = 300,
  bg = "white",
  width = 11,
  height = 5
)

Relation where someone usually bathe

By 4 Malaria

sero_4malaria_district_ussualybathe<- seropositivy_summarise(
  ffi_total,
  "4malaria",
  age_cat,
  ffi_is_place_shower
) %>%
  ggplot(
    aes(
      x = age_cat,
      y = result_malaria,
      color = malaria,
      group = malaria
    )
  ) +
  geom_point() +
  geom_line() +
  facet_grid(
    vars(ffi_is_place_shower),
    vars(ffi_is_district)    
  ) +
  scale_y_continuous(
    labels = scales::percent_format(),
    #limits = c(0, 0.50)
  ) +
  labs(
    x = "Age",
    y = "Seropositivity"
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") +
  theme_bw()

sero_4malaria_district_ussualybathe

ggsave(
  "./02_output/plots/plot25_sero_4malaria_district_ussualybathe.png",
  sero_4malaria_district_ussualybathe,
  dpi = 300,
  bg = "white",
  width = 12,
  height = 8.5
)

By Type of Malaria

sero_typeofmalaria_district_ussualybathe <- seropositivy_summarise(
  ffi_total,
  "typeofmalaria",
  age_cat,
  ffi_is_place_shower
) %>%
  ggplot(
    aes(
      x = age_cat,
      y = result_exposure,
      color = exposure,
      group = exposure
    )
  ) +
  geom_point() +
  geom_line() +
  facet_grid(
    vars(ffi_is_place_shower),
    vars(ffi_is_district)    
  ) +
  scale_y_continuous(
    labels = scales::percent_format(),
    #limits = c(0, 0.60)
  ) +
  labs(
    x = "Age",
    y = "Seropositivity"
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") +
  theme_bw()

sero_typeofmalaria_district_ussualybathe

ggsave(
  "./02_output/plots/plot26_sero_typeofmalaria_district_ussualybathe.png",
  sero_typeofmalaria_district_ussualybathe,
  dpi = 300,
  bg = "white",
  width = 12,
  height = 8.5
)

By Time of Malaria

sero_timeofmalaria_district_ussualybathe <- seropositivy_summarise(
  ffi_total,
  "timeofmalaria",
  age_cat,
  ffi_is_place_shower
) %>%
  ggplot(
    aes(
      x = age_cat,
      y = result_exposure,
      color = exposure,
      group = exposure
    )
  ) +
  geom_point() +
  geom_line() +
  facet_grid(
    vars(ffi_is_place_shower),
    vars(ffi_is_district)    
  ) +
  scale_y_continuous(
    labels = scales::percent_format(),
    #limits = c(0, 0.5)
  ) +
  labs(
    x = "Age",
    y = "Seropositivity"
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") +
  theme_bw()

sero_timeofmalaria_district_ussualybathe

ggsave(
  "./02_output/plots/plot27_sero_timeofmalaria_district_ussualybathe.png",
  sero_timeofmalaria_district_ussualybathe,
  dpi = 300,
  bg = "white",
  width = 12,
  height = 8.5
)

Relation with those who have a mosquito net

By 4 Malaria

sero_4malaria_district_mosquitnet <- seropositivy_summarise(
  ffi_total,
  "4malaria",
  age_cat,
  ffi_is_mosq_net
) %>%
  ggplot(
    aes(
      x = age_cat,
      y = result_malaria,
      color = malaria,
      group = malaria
    )
  ) +
  geom_point() +
  geom_line() +
  facet_grid(
    vars(ffi_is_mosq_net),
    vars(ffi_is_district)    
  ) +
  scale_y_continuous(
    labels = scales::percent_format(),
    #limits = c(0, 0.50)
  ) +
  labs(
    x = "Age",
    y = "Seropositivity"
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") +
  theme_bw()

sero_4malaria_district_mosquitnet

ggsave(
  "./02_output/plots/plot28_sero_4malaria_district_mosquitnet.png",
  sero_4malaria_district_mosquitnet,
  dpi = 300,
  bg = "white",
  width = 12,
  height = 8.5
)

By Type of Malaria

sero_typeofmalaria_district_mosquitnet <- seropositivy_summarise(
  ffi_total,
  "typeofmalaria",
  age_cat,
  ffi_is_mosq_net
) %>%
  ggplot(
    aes(
      x = age_cat,
      y = result_exposure,
      color = exposure,
      group = exposure
    )
  ) +
  geom_point() +
  geom_line() +
  facet_grid(
    vars(ffi_is_mosq_net),
    vars(ffi_is_district)    
  ) +
  scale_y_continuous(
    labels = scales::percent_format(),
    #limits = c(0, 0.60)
  ) +
  labs(
    x = "Age",
    y = "Seropositivity"
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") +
  theme_bw()

sero_typeofmalaria_district_mosquitnet

ggsave(
  "./02_output/plots/plot29_sero_typeofmalaria_district_mosquitnet.png",
  sero_typeofmalaria_district_mosquitnet,
  dpi = 300,
  bg = "white",
  width = 12,
  height = 8.5
)

By Time of Malaria

sero_timeofmalaria_district_mosquitnet <- seropositivy_summarise(
  ffi_total,
  "timeofmalaria",
  age_cat,
  ffi_is_mosq_net
) %>%
  ggplot(
    aes(
      x = age_cat,
      y = result_exposure,
      color = exposure,
      group = exposure
    )
  ) +
  geom_point() +
  geom_line() +
  facet_grid(
    vars(ffi_is_mosq_net),
    vars(ffi_is_district)    
  ) +
  scale_y_continuous(
    labels = scales::percent_format(),
    #limits = c(0, 0.5)
  ) +
  labs(
    x = "Age",
    y = "Seropositivity"
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") +
  theme_bw()

sero_timeofmalaria_district_mosquitnet

ggsave(
  "./02_output/plots/plot30_sero_timeofmalaria_district_mosquitnet.png",
  sero_timeofmalaria_district_mosquitnet,
  dpi = 300,
  bg = "white",
  width = 12,
  height = 8.5
)

Relation with those who have a trip in the last month

By 4 Malaria

sero_4malaria_district_tripmonth <- seropositivy_summarise(
  ffi_total,
  "4malaria",
  age_cat,
  ffi_is_trip_month
) %>%
  ggplot(
    aes(
      x = age_cat,
      y = result_malaria,
      color = malaria,
      group = malaria
    )
  ) +
  geom_point() +
  geom_line() +
  facet_grid(
    vars(ffi_is_trip_month),
    vars(ffi_is_district)    
  ) +
  scale_y_continuous(
    labels = scales::percent_format(),
    #limits = c(0, 0.50)
  ) +
  labs(
    x = "Age",
    y = "Seropositivity"
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") +
  theme_bw()

sero_4malaria_district_tripmonth

ggsave(
  "./02_output/plots/plot31_sero_4malaria_district_tripmonth.png",
  sero_4malaria_district_tripmonth,
  dpi = 300,
  bg = "white",
  width = 12,
  height = 8.5
)

By Type of Malaria

sero_typeofmalaria_district_tripmonth <- seropositivy_summarise(
  ffi_total,
  "typeofmalaria",
  age_cat,
  ffi_is_trip_month
) %>%
  ggplot(
    aes(
      x = age_cat,
      y = result_exposure,
      color = exposure,
      group = exposure
    )
  ) +
  geom_point() +
  geom_line() +
  facet_grid(
    vars(ffi_is_trip_month),
    vars(ffi_is_district)    
  ) +
  scale_y_continuous(
    labels = scales::percent_format(),
    #limits = c(0, 0.60)
  ) +
  labs(
    x = "Age",
    y = "Seropositivity"
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") +
  theme_bw()

sero_typeofmalaria_district_tripmonth

ggsave(
  "./02_output/plots/plot32_sero_typeofmalaria_district_tripmonth.png",
  sero_typeofmalaria_district_tripmonth,
  dpi = 300,
  bg = "white",
  width = 12,
  height = 8.5
)

By Time of Malaria

sero_timeofmalaria_district_tripmonth <- seropositivy_summarise(
  ffi_total,
  "timeofmalaria",
  age_cat,
  ffi_is_trip_month
) %>%
  ggplot(
    aes(
      x = age_cat,
      y = result_exposure,
      color = exposure,
      group = exposure
    )
  ) +
  geom_point() +
  geom_line() +
  facet_grid(
    vars(ffi_is_trip_month),
    vars(ffi_is_district)    
  ) +
  scale_y_continuous(
    labels = scales::percent_format(),
    #limits = c(0, 0.5)
  ) +
  labs(
    x = "Age",
    y = "Seropositivity"
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") +
  theme_bw()

sero_timeofmalaria_district_tripmonth

ggsave(
  "./02_output/plots/plot33_sero_timeofmalaria_district_tripmonth.png",
  sero_timeofmalaria_district_tripmonth,
  dpi = 300,
  bg = "white",
  width = 12,
  height = 8.5
)

Descriptive 01_data

plot_4_2 <- ffi_total %>%
  filter(ffi_is_malaria %in% c("No", "Yes")) %>%
  drop_na(age_cat, pv_historic) %>%
  mutate(
    malaria_gender = paste(gender, ffi_is_malaria)
  ) %>%
  count(pv_historic, age_cat, malaria_gender) %>%
  mutate(Percentage = n / sum(n)) %>%
  mutate(
    Percentage = case_when(
      str_detect(malaria_gender, "Female") ~ Percentage * -1,
      TRUE ~ Percentage
    )
  ) %>%
  ggplot(aes(
    y = age_cat,
    x = Percentage,
    fill = malaria_gender
  )) +
  geom_col(
    position = position_stack(reverse = TRUE),
    color = "black"
  ) +
  labs(
    x = "Age Group",
    y = NULL,
    title = "Population structure by age groups, gender and malaria transmission"
  ) +
  facet_wrap(vars(pv_historic)) + 
  scale_x_continuous(
    limits = c(-0.25, 0.25),
    breaks = seq(-0.25, 0.25, 0.05),
    labels = c(paste0(seq(25, 0, -5), "%"), paste0(seq(5, 25, 5), "%"))
  ) +
  # innovar::scale_fill_innova("npr") +
  scale_fill_discrete(
    type = innovar::innova_pal("npr")(4),
    limits = c("Male Yes", "Male No", "Female No", "Female Yes")
  ) +
  guides(
    fill = guide_legend("Have you ever \nhad malaria?")
  ) +
  geom_vline(xintercept = 0, size = 1) +
  theme_bw(base_size = 12) +
  theme(
    plot.title = element_text(
      size = 14,
      hjust = 0.5,
      face = "bold"
    ),
    strip.text = element_text(
      size = 12,
      face = "bold"
    ),
    legend.title = element_text(
      size = 12,
      face = "bold"
    ),
    plot.margin = margin(5, 15, 5, 15)
  )

Descriptive 01_data

plot_4_2 <- ffi_total %>%
  filter(ffi_is_malaria %in% c("No", "Yes")) %>%
  drop_na(age_cat, pv_historic) %>%
  mutate(
    malaria_gender = paste(gender, ffi_is_malaria)
  ) %>%
  count(pv_historic, age_cat, malaria_gender) %>%
  mutate(Percentage = n / sum(n)) %>%
  mutate(
    Percentage = case_when(
      str_detect(malaria_gender, "Female") ~ Percentage * -1,
      TRUE ~ Percentage
    )
  ) %>%
  ggplot(aes(
    y = age_cat,
    x = Percentage,
    fill = malaria_gender
  )) +
  geom_col(
    position = position_stack(reverse = TRUE),
    color = "black"
  ) +
  labs(
    x = "Age Group",
    y = NULL,
    title = "Population structure by age groups, gender and malaria transmission"
  ) +
  facet_wrap(vars(pv_historic)) + 
  scale_x_continuous(
    limits = c(-0.25, 0.25),
    breaks = seq(-0.25, 0.25, 0.05),
    labels = c(paste0(seq(25, 0, -5), "%"), paste0(seq(5, 25, 5), "%"))
  ) +
  # innovar::scale_fill_innova("npr") +
  scale_fill_discrete(
    type = innovar::innova_pal("npr")(4),
    limits = c("Male Yes", "Male No", "Female No", "Female Yes")
  ) +
  guides(
    fill = guide_legend("Have you ever \nhad malaria?")
  ) +
  geom_vline(xintercept = 0, size = 1) +
  theme_bw(base_size = 12) +
  theme(
    plot.title = element_text(
      size = 14,
      hjust = 0.5,
      face = "bold"
    ),
    strip.text = element_text(
      size = 12,
      face = "bold"
    ),
    legend.title = element_text(
      size = 12,
      face = "bold"
    ),
    plot.margin = margin(5, 15, 5, 15)
  )

Sankey_seropositive

library(ggsankey)

ffi_format_sankey <- ffi_total %>%
  mutate(
    ffi_is_access_malaria_yn_hf = factor(
      ffi_is_access_malaria_yn_hf,
      label = c("No", "Yes")
    ),
    ffi_is_mal_lifetime = as.character(ffi_is_mal_lifetime),
    ffi_is_mal_lifetime = replace_na(ffi_is_mal_lifetime, "0 times"),
    ffi_is_mal_lifetime = factor(
      ffi_is_mal_lifetime,
      labels = c(
        "0 times",
        "1 to 3 times",
        "3 to 7 times",
        "More than 7 times"
      )
    )
  )

sankey_seropositive_answ1 <- ffi_format_sankey %>%
  pivot_longer(
    cols = c(recent_exposure, ffi_is_mal_lifetime, ffi_is_access_malaria_yn_hf),
    names_to = "malaria_behavior1",
    values_to = "malaria_answ1"
  ) %>%
  count(malaria_behavior1, malaria_answ1) %>%
  group_by(malaria_behavior1) %>%
  mutate(
    percentage = scales::percent(
      n / sum(n),
      accuracy = 0.1
    )
  ) %>%
  ungroup() %>%
  mutate(
    malaria_behavior1 = fct_relevel(
      malaria_behavior1,
      "ffi_is_mal_lifetime",
      "ffi_is_access_malaria_yn_hf",
      "recent_exposure"
    ),
    malaria_percent1 = paste0(
      malaria_answ1,
      paste0("\n(", percentage, ")")
    ),
    malaria_percent1 = as_factor(malaria_percent1)
  ) %>%
  select(malaria_behavior1, malaria_answ1, malaria_percent1)


sankey_seropositive <- ffi_format_sankey %>%
  drop_na(ffi_is_mal_lifetime, 
  ffi_is_access_malaria_yn_hf,
  recent_exposure
  ) %>%
  make_long(
    ffi_is_mal_lifetime,
    ffi_is_access_malaria_yn_hf, 
    recent_exposure
  ) %>%
  left_join(
    sankey_seropositive_answ1,
      by = c(
        "x" = "malaria_behavior1",
        "node" = "malaria_answ1"
      )
  ) %>%
  mutate(
    node = malaria_percent1,
    node = fct_rev(node)
  ) %>%
  select(-malaria_percent1) %>%
  left_join(
    sankey_seropositive_answ1,
    by = c(
      "next_x" = "malaria_behavior1",
      "next_node" = "malaria_answ1"
    )
  ) %>%
  mutate(next_node = malaria_percent1) %>%
  select(-malaria_percent1) %>%
  ggplot(aes(
    x = x,
    next_x = next_x,
    node = node,
    next_node = next_node,
    fill = factor(node),
    label = node
  )) +
  geom_sankey(
    flow.alpha = .8,
    node.color = "gray30"
  ) +
  geom_sankey_label(size = 4, color = "white", fill = "gray30") +
  scale_x_discrete(
    labels = str_wrap(
      c(
        "How many times do you think you have had malaria in your life?",
        "If you had malaria, would you go to the health facility?",
        "Recent exposure to any type of plasmodium"
      ),
      30
    )
  ) +
  theme_sankey(base_size = 18) +
  innovar::scale_fill_innova("npr") +
  labs(
    x = NULL,
    title = "Behaviour associated with recent malaria exposure"
  ) +
  theme(
    legend.position = "none",
    plot.title = element_text(hjust = .5),
    plot.margin = margin(5, 5, 5, 5)
  )
ggsave("./02_output/plots/plot34_sankey_seropositive.png",
       sankey_seropositive,
       height = 7,
       width = 14,
       dpi = 300)

Relation gender and ocupation

By 4 Malaria

sero_4malaria_district_gender_economic <- seropositivy_summarise(
  ffi_total,
  "4malaria",
  economic_activities,
  gender
) %>%
  ggplot(
    aes(
      x = economic_activities,
      y = result_malaria,
      color = malaria,
      group = malaria
    )
  ) +
  geom_point() +
  geom_line() +
  facet_grid(
    vars(gender),
    vars(ffi_is_district)    
  ) +
  scale_y_continuous(
    labels = scales::percent_format(),
    limits = c(0, 0.40)
  ) +
  labs(
    x = "Economic Activities",
    y = "Seropositivity"
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") +
  theme_bw() +
  theme(
    axis.text.x = element_text(
      angle = 45,
      vjust = 1,
      hjust = 1
    )
  )

sero_4malaria_district_gender_economic

ggsave(
  "./02_output/plots/plot35_sero_4malaria_district_gender_economic.png",
  sero_4malaria_district_gender_economic,
  dpi = 300,
  bg = "white",
  width = 11,
  height = 7.5,
  scale = 0.9
)

By Type of Malaria

sero_typeofmalaria_district_gender <- seropositivy_summarise(
  ffi_total,
  "typeofmalaria",
  age_cat,
  gender
) %>%
  ggplot(
    aes(
      x = age_cat,
      y = result_exposure,
      color = exposure,
      group = exposure
    )
  ) +
  geom_point() +
  geom_line() +
  facet_grid(
    vars(gender),
    vars(ffi_is_district)    
  ) +
  scale_y_continuous(
    labels = scales::percent_format(),
    limits = c(0, 0.45)
  ) +
  labs(
    x = "Age",
    y = "Seropositivity"
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") +
  theme_bw()

sero_typeofmalaria_district_gender

ggsave(
  "./02_output/plots/plot11_sero_typeofmalaria_district_gender.png",
  sero_typeofmalaria_district_gender,
  dpi = 300,
  bg = "white",
  width = 12,
  height = 8.5
)

By Time of Malaria

sero_timeofmalaria_district_gender <- seropositivy_summarise(
  ffi_total,
  "timeofmalaria",
  age_cat,
  gender
) %>%
  ggplot(
    aes(
      x = age_cat,
      y = result_exposure,
      color = exposure,
      group = exposure
    )
  ) +
  geom_point() +
  geom_line() +
  facet_grid(
    vars(gender),
    vars(ffi_is_district)    
  ) +
  scale_y_continuous(
    labels = scales::percent_format(),
    limits = c(0, 0.45)
  ) +
  labs(
    x = "Age",
    y = "Seropositivity"
  ) +
  guides(
    color = guide_legend("Malaria")
  ) +
  innovar::scale_color_innova("npr") +
  theme_bw()

sero_timeofmalaria_district_gender

ggsave(
  "./02_output/plots/plot12_sero_timeofmalaria_district_gender.png",
  sero_timeofmalaria_district_gender,
  dpi = 300,
  bg = "white",
  width = 12,
  height = 8.5
)

Maps

library(sf)
library(leaflet)
ffi_total_gps <- ffi_total %>%
  select(
    ffi_is_cod_com:ffi_is_cod_ind,
    pf_recent:pv_historic,
    pv_exposure:historical_exposure
  ) %>%
  left_join(
    ffi_household %>%
      select(
        ffi_h_code_community:ffi_h_code_household,
        ffi_h_community
      ),
    by = c(
      "ffi_is_cod_com" = "ffi_h_code_community",
      "ffi_is_cod_household" = "ffi_h_code_household"
    )
  ) 

ffi_household_gps <- ffi_total_gps %>%
  select(
    ffi_is_cod_com:ffi_is_cod_household,
    ffi_h_community,
    recent_exposure
  ) %>%
  mutate(
    recent_exposure = case_when(
      recent_exposure == "Positive" ~ 1,
      TRUE ~ 0
    )
  ) %>%
  group_by(
    across(c(ffi_is_cod_com:ffi_h_community))
  ) %>%
  summarise(
    recent_exposure = mean(recent_exposure)
  ) %>%
  ungroup()
  # mutate(
  #   color_marker = case_when(
  #     recent_exposure == 0 ~ "red",
  #     TRUE ~ "black"
  #   )
  # )

ffi_household_gps <- ffi_household_gps %>%
  left_join(
    ffi_household %>%
      select(
        ffi_h_code_community:ffi_h_code_household,
        ffi_h_district,
        ffi_gps_long,
        ffi_gps_lat
      ),
    by = c(
      "ffi_is_cod_com" = "ffi_h_code_community",
      "ffi_is_cod_household" = "ffi_h_code_household"
    )
  ) %>%
  mutate(
    ffi_h_household_id = paste0(ffi_is_cod_com, ffi_is_cod_household),
    ffi_is_cod_com_label = paste0(
      "Cod: ",
      ffi_is_cod_household,
      " - ",
      str_to_title(ffi_h_community),
      " (",
      str_to_title(ffi_h_district),
      ")"
    )
  ) %>%
  st_as_sf(
    coords = c("ffi_gps_long", "ffi_gps_lat"),
    crs = 4326
  ) 
  

  
# colors_pal <- rev(innovar:::innova_palettes[["ecomst"]])
# pal <- colorNumeric(
#   colorRamp(colors_pal),
#   ffi_household_gps$recent_exposure
# )

pal <- colorNumeric(
  hcl.colors(17, palette = "zissou"),
  ffi_household_gps$recent_exposure
)

# icons_household <- awesomeIcons(
#   icon = "ios-home",
#   iconColor = "black",
#   library = "ion",
#   markerColor = innovar::innova_pal("ecomst", reverse = TRUE)(17)
# )

communities_sf <- communities_sf %>%
  mutate(
    ffi_h_community = str_to_title(ffi_h_community)
  ) %>%
  left_join(
    ffi_household %>%
      select(ffi_h_district, ffi_h_code_community) %>%
      distinct()
  )  %>%
  mutate(
    ffi_h_community_label = paste0(
      ffi_h_community,
      " (",
      str_to_title(ffi_h_district),
      ")"
    )
  )



household_communities_leaft <- ffi_household_gps %>%
  leaflet() %>%
  addProviderTiles(
    providers$OpenStreetMap,
    group = "OpenStreetMap"
  ) %>%
  addCircleMarkers(
    layerId = ~ffi_h_household_id,
    label = ~ffi_is_cod_com_label,
    color = ~ pal(recent_exposure),
    group = "Households",
    radius = 7,
    weight = 5,
    opacity = 1,
    fillOpacity = 0.1,
    labelOptions = labelOptions(
      style = list(
        "font-weight" = "bold",
        padding = "3px 8px"
      ),
      textsize = "12px",
      direction = "auto"
    )
  ) %>%
  # addLegend(
  #   title = "Recent Exposure",
  #   pal = pal, 
  #   values = ~ recent_exposure, 
  #   group = "circles", 
  #   position = "bottomleft",
  #   transform = ~ scales::percent_format(),
  #   opacity = 1
  # ) %>%<font-awesome-icon icon="fa-solid fa-location-dot" />
  leaflegend::addLegendNumeric(
    title = "Recent Exposure",
    pal = pal,
    values = ~ recent_exposure,
    position = "bottomright",
    orientation = "horizontal",
    height = 20,
    width = 100,
    decreasing = FALSE,
    numberFormat = scales::percent_format(),
    group = "circles"
  )  %>%
  addAwesomeMarkers(
    data = communities_sf,
    layerId = ~ffi_h_code_community,
    label = ~ffi_h_community_label,
    group = "Communities"
  ) %>%
  addProviderTiles(
    providers$OpenStreetMap,
    group = "OpenStreetMap"
  ) %>%
  addTiles(
    urlTemplate = "http://mt0.google.com/vt/lyrs=m&hl=en&x={x}&y={y}&z={z}&s=Ga",
    attribution = "Google Maps",
    options = leaflet::tileOptions(
      maxNativeZoom = 19,
      maxZoom = 20
    ),
    group = "Google Maps"
  ) %>%
  addTiles(
    urlTemplate = "https://mt1.google.com/vt/lyrs=s&x={x}&y={y}&z={z}",
    attribution = "Satellite View",
    options = leaflet::tileOptions(
      maxNativeZoom = 19,
      maxZoom = 20
    ),
    group = "Satellite View"
  ) %>%
  # Layers control*
  addLayersControl(
    overlayGroups = c("Households", "Communities"),
    baseGroups = c("OpenStreetMap", "Google Maps", "Satellite View"),
    options = layersControlOptions(collapsed = FALSE)
  ) %>%
  # addLegend(
  #   "topright",
  #   pal = innovar::innova_pal("ecomst", reverse = TRUE)(980)
  # )  %>%
  # addLegend(
  #   position = "bottomright",
  #   colors = c(
  #     "white; width:15px; height:15px;
  #                border:5px solid red; border-radius:50%;",
  #     "white; width:7.5px; height:7.5px; margin-top: 5px;
  #                border:5px solid black; border-radius:50%; margin-left:2px;"
  #   ),
  #   labels = c(
  #     "<div style='display: inline-block; height: 10px;
  #                margin-top: 8px;line-height: 10px;font-weight: bold;
  #                color: black; '>At least 1 person with recent malaria</div>",
  #     "<div style='display: inline-block;height: 10px;
  #                margin-top: 8px;line-height: 10px;font-weight: bold;
  #                color: black; margin-top: 10px;
  #                margin-left:5px'>No one with recent malaria at household</div>"
  #   ),
  #   opacity = 1
  # ) %>%
  leaflet.extras::addResetMapButton()

household_communities_leaft
htmlwidgets::saveWidget(
  household_communities_leaft,
  file = "./02_output/plots/household_communities_leaft.html"
)

webshot::webshot(
  "./02_output/plots/household_communities_leaft.html",
  "./02_output/plots/household_communities_leaft.png",
  cliprect = "viewport",
  zoom = 4
)
LS0tCnRpdGxlOiAiRGVzY3JpcHRpdmUgYW5hbHlzaXMiCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OiAKICBybWRmb3JtYXRzOjpkb3duY3V0ZToKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICBoaWdobGlnaHQ6IGthdGUKICAgIHRvY19kZXB0aDogMwogICAgZGVmYXVsdF9zdHlsZTogZGFyawogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBoaWdobGlnaHRfZG93bmxpdDogdHJ1ZQplZGl0b3Jfb3B0aW9uczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KIyMgR2xvYmFsIG9wdGlvbnMKa25pdHI6Om9wdHNfY2h1bmskc2V0KAogIGNhY2hlID0gVFJVRSwKICB3YXJuaW5nID0gRkFMU0UsCiAgbWVzc2FnZSA9IEZBTFNFCikKCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHNmKQpsaWJyYXJ5KGdnc2ZsYWJlbCkKYGBgCgojIEltcG9ydCBkYXRhCgpgYGB7cn0Kc2Vyb2xvZ3kgPC0gcmVhZF9jc3YoIi4vMDFfZGF0YS9yYXcvRkZJLnBlcnUuc2Vyb2xvZ3kua21lYW5zMi5jc3YiKSAlPiUKICByZW5hbWUoZmZpX2lzX2NvZGUgPSBDb2RpZ28pICU+JQogIHNlbGVjdCgtMSkKCmZmaV9pbmRpdmlkdWFsIDwtIHJlYWRfY3N2KCIuLzAxX2RhdGEvcmF3L2luZGl2aWR1YWxzX3Jlc3VsdF9zaGFyZV8wNzIwMjIuY3N2IikKZmZpX2hvdXNlaG9sZCA8LSByZWFkX2NzdigiLi8wMV9kYXRhL3Jhdy9ob3VzZWhvbGRfZ3BzX3NoYXJlXzA3MjAyMi5jc3YiKQpkYXRhXzIwMDBfMjAxOSA8LSByZWFkX2NzdigiLi8wMV9kYXRhL3Jhdy9EYXRhX0ZGSV8yMDAwXzIwMTlfMjAyMTI0MDUuY3N2IikKZGF0YV8yMDIwXzIwMjEgPC0gcmVhZF9jc3YoIi4vMDFfZGF0YS9yYXcvRGF0YV9GRklfMjAyMF8yMDIxXzIwMjEwNjI5LmNzdiIpCnBvYmxhY2lvbiA8LSByZWFkUkRTKCIuLzAxX2RhdGEvcmF3L3BvYmxhY2lvbl9pbmVpXzIwMTcucmRzIikKYGBgCgojIEZvcm1hdCBkYXRhCgpgYGB7cn0KZmZpX3RvdGFsIDwtIGZmaV9pbmRpdmlkdWFsICU+JQogIGZ1bGxfam9pbigKICAgIHNlcm9sb2d5ICU+JQogICAgICBtdXRhdGUoCiAgICAgICAgZmZpX2lzX2NvZGUgPSBwYXN0ZTAoMCwgZmZpX2lzX2NvZGUpCiAgICAgICksCiAgICBieSA9ICJmZmlfaXNfY29kZSIKICApCgpmZmlfdG90YWwgPC0gZmZpX3RvdGFsICU+JQogIG11dGF0ZSgKICAgIGFnZV9jYXQgPSBjYXNlX3doZW4oCiAgICAgIGZmaV9pc19hZ2VfZml4ZWQgPj0gNzAgfiAiWzcwKykiLAogICAgICBmZmlfaXNfYWdlX2ZpeGVkID49IDYwIH4gIls2MC03MCkiLAogICAgICBmZmlfaXNfYWdlX2ZpeGVkID49IDUwIH4gIls1MC02MCkiLAogICAgICBmZmlfaXNfYWdlX2ZpeGVkID49IDQwIH4gIls0MC01MCkiLAogICAgICBmZmlfaXNfYWdlX2ZpeGVkID49IDMwIH4gIlszMC00MCkiLAogICAgICBmZmlfaXNfYWdlX2ZpeGVkID49IDIwIH4gIlsyMC0zMCkiLAogICAgICBmZmlfaXNfYWdlX2ZpeGVkID49IDEwIH4gIlsxMC0yMCkiLAogICAgICBmZmlfaXNfYWdlX2ZpeGVkID49IDAgfiAiWzAtMTApIgogICAgKSwKICAgIGFnZV9jYXQgPSBmYWN0b3IoYWdlX2NhdCksCiAgICBhZ2VfY29kZSA9IGNhc2Vfd2hlbigKICAgICAgYWdlX2NhdCA9PSAiWzcwKykiIH4gOCwKICAgICAgYWdlX2NhdCA9PSAiWzYwLTcwKSIgfiA3LAogICAgICBhZ2VfY2F0ID09ICJbNTAtNjApIiB+IDYsCiAgICAgIGFnZV9jYXQgPT0gIls0MC01MCkiIH4gNSwKICAgICAgYWdlX2NhdCA9PSAiWzMwLTQwKSIgfiA0LAogICAgICBhZ2VfY2F0ID09ICJbMjAtMzApIiB+IDMsCiAgICAgIGFnZV9jYXQgPT0gIlsxMC0yMCkiIH4gMiwKICAgICAgYWdlX2NhdCA9PSAiWzAtMTApIiB+IDEsCiAgICApLAogICAgZ2VuZGVyID0gZmFjdG9yKAogICAgICBmZmlfaXNfc2V4LAogICAgICBsYWJlbHMgPSBjKCJNYWxlIiwgIkZlbWFsZSIpCiAgICApLAogICAgZmZpX2lzX21hbGFyaWEgPSBmYWN0b3IoCiAgICAgIGZmaV9pc19tYWxhcmlhLAogICAgICBsYWJlbHMgPSBjKCJObyIsICJZZXMiLCAiRG9uJ3QgS25vdyAvIE5vIEFuc3dlciIpCiAgICApLAogICAgYWNyb3NzKAogICAgICBjKHBmX3JlY2VudDpwdl9oaXN0b3JpYyksCiAgICAgIH4gZmFjdG9yKC4sIGxhYmVscyA9IGMoIk5lZ2F0aXZlIiwgIlBvc2l0aXZlIikpCiAgICApLAogICAgYWNyb3NzKAogICAgICBjKAogICAgICAgIGZmaV9pc19mZXZlcl9tb250aCwKICAgICAgICBmZmlfaXNfYW50aW1hbF9kcnVnX3VzZSwgCiAgICAgICAgZmZpX2lzX21vc3FfbmV0CiAgICAgICksCiAgICAgIH4gZmFjdG9yKC4sIGxhYmVscyA9IGMoIk5vIiwgIlllcyIpKQogICAgKSwKICAgIGZmaV9pc190cmlwX21vbnRoID0gZmFjdG9yKAogICAgICBmZmlfaXNfdHJpcF9tb250aCwKICAgICAgbGFiZWxzID0gYygiTm8iLCAiWWVzIiwgIkRvbid0IEtub3cvTm8gQW5zd2VyIikKICAgICksCiAgICBmZmlfaXNfbWFsX2xpZmV0aW1lID0gZmFjdG9yKAogICAgICBmZmlfaXNfbWFsX2xpZmV0aW1lLAogICAgICBsYWJlbHMgPSBjKAogICAgICAgICIxIHRvIDMgdGltZXMiLAogICAgICAgICIzIHRvIDcgdGltZXMiLAogICAgICAgICJNb3JlIHRoYW4gNyB0aW1lcyIKICAgICAgKQogICAgKSwKICAgIGZmaV9pc19wbGFjZV9zaG93ZXIgPSBmYWN0b3IoCiAgICAgIGZmaV9pc19wbGFjZV9zaG93ZXIsCiAgICAgIGxhYmVscyA9IGMoCiAgICAgICAgIkJhdGhyb29tIGluc2lkZSB0aGUgZHdlbGxpbmciLAogICAgICAgICJCYXRocm9vbSBvdXRzaWRlIHRoZSBkd2VsbGluZyIsCiAgICAgICAgIkluIHRoZSBjb3VudHJ5c2lkZS9yaXZlciIsCiAgICAgICAgIk90aGVyIgogICAgICApCiAgICApLAogICAgZWR1Y2F0aW9uX2xldmVsID0gY2FzZV93aGVuKAogICAgICBmZmlfaXNfaW5zdF9sZXZlbCAlaW4lIDAgfiAiTm8gc2Nob29saW5nIiwgCiAgICAgIGZmaV9pc19pbnN0X2xldmVsICVpbiUgMToyIH4gIlByaW1hcnkgc2Nob29sIiwKICAgICAgZmZpX2lzX2luc3RfbGV2ZWwgJWluJSAzOjQgfiAiU2Vjb25kYXJ5IHNjaG9vbCIsCiAgICAgIGZmaV9pc19pbnN0X2xldmVsICVpbiUgNTo2IH4gIkhpZ2hlciBlZHVjYXRpb24iCiAgICApLAogICAgZWR1Y2F0aW9uX2xldmVsID0gZmN0X3JlbGV2ZWwoZWR1Y2F0aW9uX2xldmVsLCAiTm8gc2Nob29saW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmltYXJ5IHNjaG9vbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2Vjb25kYXJ5IHNjaG9vbCIpLAogICAgZWNvbm9taWNfYWN0aXZpdGllcyA9IGZhY3RvcihmZmlfaXNfbWFpbl9lY29uX2FjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiRGF5IGxhYm91cmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV29vZCBleHRyYWN0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaXNoZXJtYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMaXZlc3RvY2sgZmFybWVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFybWVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJhZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG91c2V3aWZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3R1ZGVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vdG9yY3ljbGUgdGF4aSBkcml2ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3RoZXIiKSksCiAgICBwdl9leHBvc3VyZSA9IGNhc2Vfd2hlbigKICAgICAgcHZfcmVjZW50ID09ICJOZWdhdGl2ZSIgJiBwdl9oaXN0b3JpYyA9PSAiTmVnYXRpdmUiIH4gIk5lZ2F0aXZlIiwKICAgICAgaXMubmEocHZfcmVjZW50KSAmIGlzLm5hKHB2X2hpc3RvcmljKSB+IE5BX2NoYXJhY3Rlcl8sCiAgICAgIFRSVUUgfiAiUG9zaXRpdmUiCiAgICApLAogICAgcGZfZXhwb3N1cmUgPSBjYXNlX3doZW4oCiAgICAgIHBmX3JlY2VudCA9PSAiTmVnYXRpdmUiICYgcGZfaGlzdG9yaWMgPT0gIk5lZ2F0aXZlIiB+ICJOZWdhdGl2ZSIsCiAgICAgIGlzLm5hKHBmX3JlY2VudCkgJiBpcy5uYShwZl9oaXN0b3JpYykgfiBOQV9jaGFyYWN0ZXJfLAogICAgICBUUlVFIH4gIlBvc2l0aXZlIgogICAgKSwKICAgIHJlY2VudF9leHBvc3VyZSA9IGNhc2Vfd2hlbigKICAgICAgcHZfcmVjZW50ID09ICJOZWdhdGl2ZSIgJiBwZl9yZWNlbnQgPT0gIk5lZ2F0aXZlIiB+ICJOZWdhdGl2ZSIsCiAgICAgIGlzLm5hKHB2X3JlY2VudCkgJiBpcy5uYShwZl9yZWNlbnQpIH4gTkFfY2hhcmFjdGVyXywKICAgICAgVFJVRSB+ICJQb3NpdGl2ZSIKICAgICksCiAgICBoaXN0b3JpY2FsX2V4cG9zdXJlID0gY2FzZV93aGVuKAogICAgICBwdl9oaXN0b3JpYyA9PSAiTmVnYXRpdmUiICYgcGZfaGlzdG9yaWMgPT0gIk5lZ2F0aXZlIiB+ICJOZWdhdGl2ZSIsCiAgICAgIGlzLm5hKHB2X2hpc3RvcmljKSAmIGlzLm5hKHBmX2hpc3RvcmljKSB+IE5BX2NoYXJhY3Rlcl8sCiAgICAgIFRSVUUgfiAiUG9zaXRpdmUiCiAgICApLAogICAgb25seV9wdl9leHBvc3VyZSA9IGNhc2Vfd2hlbigKICAgICAgcHZfZXhwb3N1cmUgPT0gIlBvc2l0aXZlIiAmIHBmX2V4cG9zdXJlID09ICJOZWdhdGl2ZSIgfiAiUG9zaXRpdmUiLCAKICAgICAgVFJVRSB+ICJOZWdhdGl2ZSIKICAgICksCiAgICBvbmx5X3BmX2V4cG9zdXJlID0gY2FzZV93aGVuKAogICAgICBwZl9leHBvc3VyZSA9PSAiUG9zaXRpdmUiICYgcHZfZXhwb3N1cmUgPT0gIk5lZ2F0aXZlIiB+ICJQb3NpdGl2ZSIsIAogICAgICBUUlVFIH4gIk5lZ2F0aXZlIgogICAgKSwKICAgIHB2X3BmX2V4cG9zdXJlID0gY2FzZV93aGVuKAogICAgICBwdl9leHBvc3VyZSA9PSAiUG9zaXRpdmUiICYgcGZfZXhwb3N1cmUgPT0gIlBvc2l0aXZlIiB+ICJQb3NpdGl2ZSIsCiAgICAgIFRSVUUgfiAiTmVnYXRpdmUiCiAgICApLAogICAgZnJlZWRvbV9tYWxhcmlhID0gY2FzZV93aGVuKAogICAgICBwdl9leHBvc3VyZSA9PSAiTmVnYXRpdmUiICYgcGZfZXhwb3N1cmUgPT0gIk5lZ2F0aXZlIiB+ICJQb3NpdGl2ZSIsIAogICAgICBUUlVFIH4gIk5lZ2F0aXZlIgogICAgKSwKICAgIG9ubHlfcHZfcmVjZW50ID0gY2FzZV93aGVuKAogICAgICBwdl9yZWNlbnQgPT0gIlBvc2l0aXZlIiAmIHBmX3JlY2VudCA9PSAiTmVnYXRpdmUiIH4gIlBvc2l0aXZlIiwgCiAgICAgIFRSVUUgfiAiTmVnYXRpdmUiCiAgICApLAogICAgb25seV9wZl9yZWNlbnQgPSBjYXNlX3doZW4oCiAgICAgIHBmX3JlY2VudCA9PSAiUG9zaXRpdmUiICYgcHZfcmVjZW50ID09ICJOZWdhdGl2ZSIgfiAiUG9zaXRpdmUiLCAKICAgICAgVFJVRSB+ICJOZWdhdGl2ZSIKICAgICksCiAgICBwdl9wZl9yZWNlbnQgPSBjYXNlX3doZW4oCiAgICAgIHB2X3JlY2VudCA9PSAiUG9zaXRpdmUiICYgcGZfcmVjZW50ID09ICJQb3NpdGl2ZSIgfiAiUG9zaXRpdmUiLAogICAgICBUUlVFIH4gIk5lZ2F0aXZlIgogICAgKSwKICAgIGZyZWVkb21fbWFsYXJpYV9yZWNlbnQgPSBjYXNlX3doZW4oCiAgICAgIHB2X3JlY2VudCA9PSAiTmVnYXRpdmUiICYgcGZfcmVjZW50ID09ICJOZWdhdGl2ZSIgfiAiUG9zaXRpdmUiLCAKICAgICAgVFJVRSB+ICJOZWdhdGl2ZSIKICAgICksCiAgICBvbmx5X3B2X2hpc3RvcmljID0gY2FzZV93aGVuKAogICAgICBwdl9oaXN0b3JpYyA9PSAiUG9zaXRpdmUiICYgcGZfaGlzdG9yaWMgPT0gIk5lZ2F0aXZlIiB+ICJQb3NpdGl2ZSIsIAogICAgICBUUlVFIH4gIk5lZ2F0aXZlIgogICAgKSwKICAgIG9ubHlfcGZfaGlzdG9yaWMgPSBjYXNlX3doZW4oCiAgICAgIHBmX2hpc3RvcmljID09ICJQb3NpdGl2ZSIgJiBwdl9oaXN0b3JpYyA9PSAiTmVnYXRpdmUiIH4gIlBvc2l0aXZlIiwgCiAgICAgIFRSVUUgfiAiTmVnYXRpdmUiCiAgICApLAogICAgcHZfcGZfaGlzdG9yaWMgPSBjYXNlX3doZW4oCiAgICAgIHB2X2hpc3RvcmljID09ICJQb3NpdGl2ZSIgJiBwZl9oaXN0b3JpYyA9PSAiUG9zaXRpdmUiIH4gIlBvc2l0aXZlIiwKICAgICAgVFJVRSB+ICJOZWdhdGl2ZSIKICAgICksCiAgICBmcmVlZG9tX21hbGFyaWFfaGlzdG9yaWMgPSBjYXNlX3doZW4oCiAgICAgIHB2X2hpc3RvcmljID09ICJOZWdhdGl2ZSIgJiBwZl9oaXN0b3JpYyA9PSAiTmVnYXRpdmUiIH4gIlBvc2l0aXZlIiwgCiAgICAgIFRSVUUgfiAiTmVnYXRpdmUiCiAgICApLAogICAgYWNyb3NzKGMocHZfZXhwb3N1cmU6ZnJlZWRvbV9tYWxhcmlhX2hpc3RvcmljKSwgZmFjdG9yKQogICkKCmxhYmVsbGVkOjp2YXJfbGFiZWwoZmZpX3RvdGFsKSA8LSBsaXN0KAogIGZmaV9pc19kaXN0cmljdCA9ICJEaXN0cmljcyIsCiAgZ2VuZGVyID0gIkdlbmRlciIsCiAgYWdlX2NhdCA9ICJBZ2UiLAogIGVkdWNhdGlvbl9sZXZlbCA9ICJFZHVjYXRpb24gTGV2ZWwiLAogIGVjb25vbWljX2FjdGl2aXRpZXMgPSAiRWNvbm9taWMgQWN0aXZpdGllcyIsCiAgcGZfcmVjZW50ID0gIlJlY2VudCBQLiBGYWxjaXBhcnVtIiwKICBwZl9oaXN0b3JpYyA9ICJIaXN0b3JpY2FsIFAuIEZhbGNpcGFydW0iLAogIHB2X3JlY2VudCA9ICJSZWNlbnQgUC4gVml2YXgiLAogIHB2X2hpc3RvcmljID0gIkhpc3RvcmljYWwgUC4gVml2YXgiLAogIHB2X2V4cG9zdXJlID0gIlAuIFZpdmF4IEV4cG9zdXJlIiwKICBwZl9leHBvc3VyZSA9ICJQLiBGYWxjaXBhcnVtIEV4cG9zdXJlIgopCmBgYAoKYGBge3IgZXZhbCA9IEZBTFNFfQpzYXZlUkRTKGZmaV90b3RhbCwgCiAgICAgICAgZmlsZSA9ICIwMV9kYXRhL3Byb2Nlc3NlZC9mZmlfdG90YWwucmRzIikKYGBgCgojIFRhYmxlIGRlc2NyaXB0aXZlCgpgYGB7cn0KbGlicmFyeShndHN1bW1hcnkpCgpmaXNoZXIudGVzdC5zaW11bGF0ZS5wLnZhbHVlcyA8LSBmdW5jdGlvbihkYXRhLCB2YXJpYWJsZSwgYnksIC4uLikgewogIHJlc3VsdCA8LSBsaXN0KCkKICB0ZXN0X3Jlc3VsdHMgPC0gc3RhdHM6OmZpc2hlci50ZXN0KGRhdGFbW3ZhcmlhYmxlXV0sIGRhdGFbW2J5XV0sIHNpbXVsYXRlLnAudmFsdWUgPSBUUlVFKQogIHJlc3VsdCRwIDwtIHRlc3RfcmVzdWx0cyRwLnZhbHVlCiAgcmVzdWx0JHRlc3QgPC0gdGVzdF9yZXN1bHRzJG1ldGhvZAogIHJlc3VsdAp9CmBgYAoKIyMgVGFibGUgZm9yIGRpc3RyaWN0CgpgYGB7cn0KdGFibGVfMSA8LSBmZmlfdG90YWwgJT4lCiAgc2VsZWN0KAogICAgZmZpX2lzX2Rpc3RyaWN0LAogICAgZ2VuZGVyLAogICAgYWdlX2NhdCwKICAgIGVkdWNhdGlvbl9sZXZlbCwKICAgIGVjb25vbWljX2FjdGl2aXRpZXMsCiAgICBwZl9yZWNlbnQ6cHZfaGlzdG9yaWMKICApICU+JQogIHRibF9zdW1tYXJ5KAogICAgYnkgPSAiZmZpX2lzX2Rpc3RyaWN0IiwKICAgIG1pc3NpbmdfdGV4dCA9ICJNaXNzaW5nIgogICkgJT4lCiAgYWRkX24oKSAlPiUKICBhZGRfb3ZlcmFsbCgpICU+JQogIGFkZF9wKAogICAgIHRlc3QgPSBsaXN0KGFsbF9jYXRlZ29yaWNhbCgpIH4gImZpc2hlci50ZXN0LnNpbXVsYXRlLnAudmFsdWVzIikKICApICU+JSAKICBib2xkX3AoKSAlPiUKICBtb2RpZnlfaGVhZGVyKGxhYmVsID0gIioqVmFyaWFibGUqKiIpICU+JQogIGJvbGRfbGFiZWxzKCkKICAKdGFibGUxCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KdGFibGVfMSAlPiUKICBhc19mbGV4X3RhYmxlKCkgJT4lCiAgZmxleHRhYmxlOjpzYXZlX2FzX2RvY3gocGF0aCA9ICIuLzAyX291dHB1dC9yZXBvcnRzL3RhYmxlMS5kb2N4IikKYGBgCgojIyBUYWJsZSBmb3IgUGxhc21vZGl1bQpgYGB7cn0KIHRhYmxlMiA8LSBmZmlfdG90YWwgJT4lCiAgIHNlbGVjdCgKICAgICBnZW5kZXIsCiAgICAgYWdlX2NhdCwKICAgICBlZHVjYXRpb25fbGV2ZWwsCiAgICAgZWNvbm9taWNfYWN0aXZpdGllcywKICAgICBwZl9leHBvc3VyZSwKICAgICBwdl9leHBvc3VyZQogICApICU+JQogICBkcm9wX25hKHBmX2V4cG9zdXJlLCBwdl9leHBvc3VyZSkgJT4lCiAgIHBpdm90X2xvbmdlcigKICAgICBjb2xzID0gcHZfZXhwb3N1cmU6cGZfZXhwb3N1cmUsCiAgICAgbmFtZXNfdG8gPSAiZXhwb3N1cmUiLAogICAgIHZhbHVlc190byA9ICJyZXN1bHRfZXhwb3N1cmUiCiAgICkgJT4lCiAgIG11dGF0ZSgKICAgIGV4cG9zdXJlID0gY2FzZV93aGVuKAogICAgICBleHBvc3VyZSA9PSAicHZfZXhwb3N1cmUiIH4gIlAuIFZpdmF4IEV4cG9zdXJlIiwKICAgICAgZXhwb3N1cmUgPT0gInBmX2V4cG9zdXJlIiB+ICJQLiBGYWxjaXBhcnVtIEV4cG9zdXJlIgogICAgKQogICApICU+JQogICB0Ymxfc3RyYXRhKAogICAgc3RyYXRhID0gZXhwb3N1cmUsCiAgICAudGJsX2Z1biA9CiAgICAgIH4gLnggJT4lCiAgICAgICAgICB0Ymxfc3VtbWFyeSgKICAgICAgICAgICAgYnkgPSByZXN1bHRfZXhwb3N1cmUsCiAgICAgICAgICAgIG1pc3NpbmdfdGV4dCA9ICJNaXNzaW5nIgogICAgICAgICAgKSAlPiUKICAgICAgICAgIGFkZF9wKAogICAgICAgICAgICB0ZXN0ID0gbGlzdChhbGxfY2F0ZWdvcmljYWwoKSB+ICJmaXNoZXIudGVzdC5zaW11bGF0ZS5wLnZhbHVlcyIpCiAgICAgICAgICApICU+JQogICAgICAgICAgYm9sZF9wKCkgJT4lCiAgICAgICAgICBtb2RpZnlfaGVhZGVyKGxhYmVsID0gIioqVmFyaWFibGUqKiIpICU+JQogICAgICAgICAgYm9sZF9sYWJlbHMoKSAKICAgKSAKCnRhYmxlMl9vdmVyYWxsIDwtIGZmaV90b3RhbCAlPiUKICBzZWxlY3QoCiAgICBnZW5kZXIsCiAgICBhZ2VfY2F0LAogICAgZWR1Y2F0aW9uX2xldmVsLAogICAgZWNvbm9taWNfYWN0aXZpdGllcywKICAgIHBmX2V4cG9zdXJlLAogICAgcHZfZXhwb3N1cmUKICApICU+JQogIGRyb3BfbmEocGZfZXhwb3N1cmUsIHB2X2V4cG9zdXJlKSAlPiUKICB0Ymxfc3VtbWFyeSgKICAgIG1pc3NpbmdfdGV4dCA9ICJNaXNzaW5nIgogICkgJT4lCiAgbW9kaWZ5X2hlYWRlcigKICAgIGxhYmVsID0gIioqVmFyaWFibGUqKiIKICApICU+JQogIGJvbGRfbGFiZWxzKCkgJT4lCiAgbW9kaWZ5X3NwYW5uaW5nX2hlYWRlcihzdGF0XzAgfiAiKipPdmVyYWxsKioiKQoKdGFibGUyIDwtIHRibF9tZXJnZSgKICB0YmxzID0gbGlzdCh0YWJsZTIsIHRhYmxlMl9vdmVyYWxsKSwKICB0YWJfc3Bhbm5lciA9IEZBTFNFCikKCnRhYmxlMgpgYGAKCmBgYHtyIGV2YWw9RkFMU0V9CnRhYmxlMiAlPiUKICBhc19mbGV4X3RhYmxlKCkgJT4lCiAgZmxleHRhYmxlOjpzYXZlX2FzX2RvY3gocGF0aCA9ICIuLzAyX291dHB1dC9yZXBvcnRzL3RhYmxlMi5kb2N4IikKYGBgCgojIyBUYWJsZSBmb3IgRXhwb3N1cmUgVGltZQoKYGBge3J9CiB0YWJsZTMgPC0gZmZpX3RvdGFsICU+JQogICBzZWxlY3QoCiAgICAgZ2VuZGVyLAogICAgIGFnZV9jYXQsCiAgICAgZWR1Y2F0aW9uX2xldmVsLAogICAgIGVjb25vbWljX2FjdGl2aXRpZXMsCiAgICAgcmVjZW50X2V4cG9zdXJlLAogICAgIGhpc3RvcmljYWxfZXhwb3N1cmUKICAgKSAlPiUKICAgZHJvcF9uYShyZWNlbnRfZXhwb3N1cmUsIGhpc3RvcmljYWxfZXhwb3N1cmUpICU+JQogICBwaXZvdF9sb25nZXIoCiAgICAgY29scyA9IHJlY2VudF9leHBvc3VyZTpoaXN0b3JpY2FsX2V4cG9zdXJlLAogICAgIG5hbWVzX3RvID0gImV4cG9zdXJlIiwKICAgICB2YWx1ZXNfdG8gPSAicmVzdWx0X2V4cG9zdXJlIgogICApICU+JQogICBtdXRhdGUoCiAgICBleHBvc3VyZSA9IGNhc2Vfd2hlbigKICAgICAgZXhwb3N1cmUgPT0gInJlY2VudF9leHBvc3VyZSIgfiAiUmVjZW50IEV4cG9zdXJlIiwKICAgICAgZXhwb3N1cmUgPT0gImhpc3RvcmljYWxfZXhwb3N1cmUiIH4gIkhpc3RvcmljYWwgRXhwb3N1cmUiCiAgICApCiAgICkgJT4lCiAgIHRibF9zdHJhdGEoCiAgICBzdHJhdGEgPSBleHBvc3VyZSwKICAgIC50YmxfZnVuID0KICAgICAgfiAueCAlPiUKICAgICAgICAgIHRibF9zdW1tYXJ5KAogICAgICAgICAgICBieSA9IHJlc3VsdF9leHBvc3VyZSwKICAgICAgICAgICAgbWlzc2luZ190ZXh0ID0gIk1pc3NpbmciCiAgICAgICAgICApICU+JQogICAgICAgICAgYWRkX3AoCiAgICAgICAgICAgIHRlc3QgPSBsaXN0KGFsbF9jYXRlZ29yaWNhbCgpIH4gImZpc2hlci50ZXN0LnNpbXVsYXRlLnAudmFsdWVzIikKICAgICAgICAgICkgJT4lCiAgICAgICAgICBib2xkX3AoKSAlPiUKICAgICAgICAgIG1vZGlmeV9oZWFkZXIobGFiZWwgPSAiKipWYXJpYWJsZSoqIikgJT4lCiAgICAgICAgICBib2xkX2xhYmVscygpIAogICApIAoKdGFibGUzX292ZXJhbGwgPC0gZmZpX3RvdGFsICU+JQogIHNlbGVjdCgKICAgIGdlbmRlciwKICAgIGFnZV9jYXQsCiAgICBlZHVjYXRpb25fbGV2ZWwsCiAgICBlY29ub21pY19hY3Rpdml0aWVzLAogICAgcmVjZW50X2V4cG9zdXJlLAogICAgaGlzdG9yaWNhbF9leHBvc3VyZQogICkgJT4lCiAgZHJvcF9uYShyZWNlbnRfZXhwb3N1cmUsIGhpc3RvcmljYWxfZXhwb3N1cmUpICU+JQogIHRibF9zdW1tYXJ5KAogICAgbWlzc2luZ190ZXh0ID0gIk1pc3NpbmciCiAgKSAlPiUKICBtb2RpZnlfaGVhZGVyKAogICAgbGFiZWwgPSAiKipWYXJpYWJsZSoqIgogICkgJT4lCiAgYm9sZF9sYWJlbHMoKSAlPiUKICBtb2RpZnlfc3Bhbm5pbmdfaGVhZGVyKHN0YXRfMCB+ICIqKk92ZXJhbGwqKiIpCgp0YWJsZTMgPC0gdGJsX21lcmdlKAogIHRibHMgPSBsaXN0KHRhYmxlMywgdGFibGUzX292ZXJhbGwpLAogIHRhYl9zcGFubmVyID0gRkFMU0UKKQoKdGFibGUzCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KdGFibGUzICU+JQogIGFzX2ZsZXhfdGFibGUoKSAlPiUKICBmbGV4dGFibGU6OnNhdmVfYXNfZG9jeChwYXRoID0gIi4vMDJfb3V0cHV0L3JlcG9ydHMvdGFibGUzLmRvY3giKQpgYGAKCgojIERpc3RhbmNlIGNvbW11bml0aWVzIGFuZCByZWdpb25hbCBIb3NwaXRhbAoKYGBge3J9CmlxdWl0b3NfY2VudHJvIDwtIHRpYmJsZSgKICAiZmZpX2hfaGVhbHRoX2ZhY2lsaXR5X25hbWUiID0gIkhvc3BpdGFsIFJlZ2lvbmFsIGRlIExvcmV0byIsCiAgTG9uZ2l0dWRlID0gLTczLjI1Mzg1OTAyMDgwOTA2LAogIExhdGl0dWRlID0gLTMuNzI2NDA2MDE2NDE0ODcxNiwKKSAlPiUKICBzdF9hc19zZihjb29yZHMgPSBjKCJMb25naXR1ZGUiLCAiTGF0aXR1ZGUiKSwgY3JzID0gNDMyNikgJT4lCiAgc3RfdHJhbnNmb3JtKGNycyA9IDMyNzE4KQoKY29tbXVuaXRpZXNfc2YgPC0gZmZpX2hvdXNlaG9sZCAlPiUKICBzZWxlY3QoCiAgICBmZmlfaF9kaXN0cmljdCwKICAgIGZmaV9oX2NvZGVfY29tbXVuaXR5LAogICAgZmZpX2hfY29tbXVuaXR5LAogICAgZmZpX2dwc19sb25nLAogICAgZmZpX2dwc19sYXQKICApICU+JQogIHN0X2FzX3NmKAogICAgY29vcmRzID0gYygiZmZpX2dwc19sb25nIiwgImZmaV9ncHNfbGF0IiksCiAgICBjcnMgPSA0MzI2CiAgKSAlPiUKICBncm91cF9ieShmZmlfaF9kaXN0cmljdCwgZmZpX2hfY29kZV9jb21tdW5pdHksIGZmaV9oX2NvbW11bml0eSkgJT4lCiAgc3VtbWFyaXNlKCkgJT4lCiAgc3RfY2VudHJvaWQoKQogIAoKY29tbXVuaXRpZXNfZGlzdGFuY2VzIDwtIGNvbW11bml0aWVzX3NmICU+JQogIHN0X3RyYW5zZm9ybShjcnMgPSAzMjcxOCkgJT4lCiAgc3RfZGlzdGFuY2UoaXF1aXRvc19jZW50cm8pCgpjb21tdW5pdGllc19kaXN0YW5jZXMgPC0gZW5mcmFtZShjb21tdW5pdGllc19kaXN0YW5jZXMpICU+JQogIG11dGF0ZSgKICAgIGZmaV9pc19jb2RfY29tID0gY29tbXVuaXRpZXNfc2YkZmZpX2hfY29kZV9jb21tdW5pdHksCiAgICBmZmlfaXNfY29tbXVuaXR5ID0gY29tbXVuaXRpZXNfc2YkZmZpX2hfY29tbXVuaXR5LAogICAgZGlzdGFuY2UgPSBhcy5udW1lcmljKHZhbHVlKQogICkgJT4lCiAgc2VsZWN0KC1jKG5hbWUsIHZhbHVlKSkKYGBgCgpMYXMgQ29tdW5pZGFkZXMgbWFzIGNlcmNhbmFzIHkgbWFzIGxlamFuYXMgcG9yIGRpc3RyaXRvOgoKYGBge3J9CmNvbW11bml0aWVzX2Rpc3RhbmNlcyAlPiUKICBtdXRhdGUoCiAgICBmZmlfaF9kaXN0cmljdCA9IGNvbW11bml0aWVzX3NmJGZmaV9oX2Rpc3RyaWN0CiAgKSAlPiUKICBncm91cF9ieShmZmlfaF9kaXN0cmljdCkgJT4lCiAgc2xpY2VfbWluKGRpc3RhbmNlLCBuID0gMSkgJT4lCiAgYmluZF9yb3dzKAogICAgY29tbXVuaXRpZXNfZGlzdGFuY2VzICU+JQogICAgICBtdXRhdGUoCiAgICAgICAgZmZpX2hfZGlzdHJpY3QgPSBjb21tdW5pdGllc19zZiRmZmlfaF9kaXN0cmljdAogICAgICApICU+JQogICAgICBncm91cF9ieShmZmlfaF9kaXN0cmljdCkgJT4lCiAgICAgIHNsaWNlX21heChkaXN0YW5jZSwgbiA9IDEpCiAgKSAlPiUKICBhcnJhbmdlKGZmaV9oX2Rpc3RyaWN0LCBkaXN0YW5jZSkKYGBgCgojIFBsb3RzCgojIyBNYWxhcmlhIEFubnVhbCBQYXJhc2l0ZSBJbmRleAoKCmBgYHtyfQpkYXRhX21hbGFyaWEgPC0gYmluZF9yb3dzKAogIGRhdGFfMjAwMF8yMDE5LAogIGRhdGFfMjAyMF8yMDIxCikgJT4lCiAgZHJvcF9uYShEaXN0cmljdCkKCnBvYl9sb3JldG8gPC0gcG9ibGFjaW9uICU+JQogIGZpbHRlcihkZXAgPT0gIkxPUkVUTyIpICU+JQogIHNlbGVjdChEaXN0cmljdCA9IGRpc3RyLCBUb3RhbCkKYGBgCgoKYGBge3J9Cm1hbGFyaWFfY2FzZXNfcG9iIDwtIGRhdGFfbWFsYXJpYSAlPiUKICByb3d3aXNlKCkgJT4lCiAgbXV0YXRlKAogICAgY2FzZXNfbWFsYXJpYSA9IHN1bSgKICAgICAgY19hY3Jvc3MoYygKICAgICAgICBgQ29uZmlybWVkIFAuIEZhbGNpcGFydW1gLAogICAgICAgIGBDb25maXJtZWQgUC4gVml2YXhgCiAgICAgICkpLAogICAgICBuYS5ybSA9IFRSVUUKICAgICkKICApICU+JQogIGdyb3VwX2J5KERpc3RyaWN0KSAlPiUKICBzdW1tYXJpc2UoY2FzZXNfbWFsYXJpYSA9IHN1bShjYXNlc19tYWxhcmlhKSkKCm1hbGFyaWFfY2FzZXNfcG9iIDwtIG1hbGFyaWFfY2FzZXNfcG9iICU+JQogIGxlZnRfam9pbigKICAgIHBvYl9sb3JldG8KICApICU+JQogIG11dGF0ZSgKICAgIGFwaSA9IGNhc2VzX21hbGFyaWEgKiAxMDAwIC8gVG90YWwKICApCgpkYXRhKFBlcnUsIHBhY2thZ2UgPSAiaW5ub3ZhciIpCgptYWxhcmlhX2Nhc2VzX3BvYl9zZiA8LSBQZXJ1ICU+JQogIGZpbHRlcihkZXAgPT0gIkxPUkVUTyIpICU+JQogIHNlbGVjdChEaXN0cmljdCA9IGRpc3RyLCBnZW9tZXRyeSkgJT4lIAogIHJpZ2h0X2pvaW4oCiAgICBtYWxhcmlhX2Nhc2VzX3BvYgogICkKYGBgCgoKYGBge3J9CmZpZ3VyZTEgPC0gZ2dwbG90KG1hbGFyaWFfY2FzZXNfcG9iX3NmKSArCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGFwaSwgZ2VvbWV0cnkgPSBnZW9tZXRyeSkpICsKICBnZW9tX3NmKGRhdGEgPSBtYWxhcmlhX2Nhc2VzX3BvYl9zZiAlPiUgZHBseXI6OmZpbHRlcihEaXN0cmljdCA9PSAiQkVMRU4iKSwgY29sb3VyID0gIiNhYTY0MzkiLCBmaWxsID0gTkEsIHNpemUgPSAxLjUsIGFlcyhmaWxsID0gYXBpLCBnZW9tZXRyeSA9IGdlb21ldHJ5KSkgKwogIGdlb21fc2YoZGF0YSA9IG1hbGFyaWFfY2FzZXNfcG9iX3NmICU+JSBkcGx5cjo6ZmlsdGVyKERpc3RyaWN0ID09ICJJTkRJQU5BIiksIGNvbG91ciA9ICIjMjU2ZTVkIiwgZmlsbCA9IE5BLCBzaXplID0gMS41LCBhZXMoZmlsbCA9IGFwaSwgZ2VvbWV0cnkgPSBnZW9tZXRyeSkpICsKICBzY2FsZV9maWxsX2Rpc3RpbGxlcigKICAgIG5hbWUgPSAiQVBJIiwKICAgIG5hLnZhbHVlID0gImJsYWNrIiwKICAgICMgbGltaXRzID0gYygwLCA0MDAwKSwKICAgIHBhbGV0dGUgPSAiUmRZbEduIiwKICAgIGRpcmVjdGlvbiA9IC0xLAogICAgYnJlYWtzID0gc2NhbGVzOjpwcmV0dHlfYnJlYWtzKG4gPSA1KSwKICAgIHZhbHVlcyA9IGMoCiAgICAgIDAsCiAgICAgIDAuMDAxLAogICAgICAwLjAwMiwKICAgICAgMC4wMDUsCiAgICAgIDAuMDA4LAogICAgICAwLjAxLAogICAgICAwLjAyLAogICAgICAwLjAzLAogICAgICAwLjA1LAogICAgICAwLjEsCiAgICAgIDAuNiwKICAgICAgMC45LAogICAgICAxCiAgICApCiAgKSArCiAgbGFicygKICAgIHggPSBOVUxMLAogICAgeSA9IE5VTEwsCiAgICB0aXRsZSA9IE5VTEwKICApICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGdlb21fc2ZfbGFiZWxfcmVwZWwoCiAgICBkYXRhID0gbWFsYXJpYV9jYXNlc19wb2Jfc2YgJT4lIGRwbHlyOjpmaWx0ZXIoRGlzdHJpY3QgPT0gIkJFTEVOIiksCiAgICBhZXMobGFiZWwgPSBEaXN0cmljdCksCiAgICBtaW4uc2VnbWVudC5sZW5ndGggPSAwLAogICAgZm9yY2UgPSAxMDAsCiAgICBudWRnZV94ID0gLTEsCiAgICBzZWVkID0gMTAsCiAgICBjb2xvdXIgPSAiI2FhNjQzOSIKICApICsKICBnZW9tX3NmX2xhYmVsX3JlcGVsKAogICAgZGF0YSA9IG1hbGFyaWFfY2FzZXNfcG9iX3NmICU+JSBkcGx5cjo6ZmlsdGVyKERpc3RyaWN0ID09ICJJTkRJQU5BIiksCiAgICBhZXMobGFiZWwgPSBEaXN0cmljdCksCiAgICBtaW4uc2VnbWVudC5sZW5ndGggPSAwLAogICAgZm9yY2UgPSAxMDAsCiAgICBudWRnZV94ID0gMSwKICAgIHNlZWQgPSAxMCwKICAgIGNvbG91ciA9ICIjMjU2ZTVkIgogICkKCmZpZ3VyZTEKYGBgCgpgYGB7ciBldmFsPUZBTFNFfQpnZ3NhdmUoCiAgIi4vMDJfb3V0cHV0L3Bsb3RzL2ZpZ3VyZTEucG5nIiwKICBmaWd1cmUxLAogIGRldmljZSA9IGdyRGV2aWNlczo6cG5nLAogIGRwaSA9IDMwMAopCmBgYAoKCiMjIFNlcm9sb2dpY2FsIFJlc3VsdHMKCiMjIyBCeSBjb21tdW5pdGllcyBhbmQgdHlwZSBvZiBwbGFzbW9kaXVtL3RpbWUKYGBge3J9CiMgZmZpX3RvdGFsICU+JQojICAgZ2dwbG90KGFlcygKIyAgICAgeCA9IGZmaV9pc19jb21tdW5pdHksCiMgICAgIGZpbGwgPSBwdl9oaXN0b3JpYwojICAgKSkgKwojICAgY29vcmRfZmxpcCh5bGltID0gYygwLCAwLjI1KSkgKwojICAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpCgpwbG90MSA8LSBmZmlfdG90YWwgJT4lCiAgZHJvcF9uYShwZl9yZWNlbnQ6cHZfaGlzdG9yaWMpICU+JQogIGxlZnRfam9pbigKICAgIGNvbW11bml0aWVzX2Rpc3RhbmNlcwogICkgICU+JQogIHBpdm90X2xvbmdlcigKICAgIGNvbHMgPSBwZl9yZWNlbnQ6cHZfaGlzdG9yaWMsCiAgICBuYW1lc190byA9ICJtYWxhcmlhIiwKICAgIHZhbHVlc190byA9ICJyZXN1bHRfbWFsYXJpYSIKICApICU+JQogIG11dGF0ZSgKICAgIG1hbGFyaWEgPSBjYXNlX3doZW4oCiAgICAgIG1hbGFyaWEgPT0gInBmX3JlY2VudCIgfiAiUmVjZW50IFAuIEZhbGNpcGFydW0iLAogICAgICBtYWxhcmlhID09ICJwZl9oaXN0b3JpYyIgfiAiSGlzdG9yaWNhbCBQLiBGYWxjaXBhcnVtIiwKICAgICAgbWFsYXJpYSA9PSAicHZfcmVjZW50IiB+ICJSZWNlbnQgUC4gVml2YXgiLAogICAgICBtYWxhcmlhID09ICJwdl9oaXN0b3JpYyIgfiAiSGlzdG9yaWNhbCBQLiBWaXZheCIKICAgICksCiAgICBmZmlfaXNfY29tbXVuaXR5ID0gc3RyX3RvX3RpdGxlKGZmaV9pc19jb21tdW5pdHkpLAogICAgZmZpX2lzX2NvbW11bml0eSA9IHBhc3RlMCgKICAgICAgZmZpX2lzX2NvbW11bml0eSwKICAgICAgIiAoIiwKICAgICAgc3RyX3RvX3RpdGxlKGZmaV9pc19kaXN0cmljdCksCiAgICAgICIpIgogICAgKSwKICAgIGZmaV9pc19jb21tdW5pdHkgPSBmY3RfcmVvcmRlcigKICAgICAgZmZpX2lzX2NvbW11bml0eSwKICAgICAgZGlzdGFuY2UsCiAgICAgIC5kZXNjID0gVFJVRQogICAgKQogICkgJT4lCiAgZ2dwbG90KGFlcygKICAgIHggPSBmZmlfaXNfY29tbXVuaXR5LAogICAgZmlsbCA9IHJlc3VsdF9tYWxhcmlhCiAgKSkgKwogIGZhY2V0X3dyYXAodmFycyhtYWxhcmlhKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiLCBjb2xvciA9ICJibGFjayIpICsKICBjb29yZF9mbGlwKHlsaW0gPSBjKDAsIDAuMjUpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpCiAgKSArCiAgI2dnc2NpOjpzY2FsZV9maWxsX2xhbmNldCgpICsKICBpbm5vdmFyOjpzY2FsZV9maWxsX2lubm92YSgibnByIikgKwogIGxhYnMoCiAgICB4ID0gIkNvbW11bml0aWVzIiwKICAgIHkgPSAiUGVyY2VudGFnZSIKICApICsKICBndWlkZXMoCiAgICBmaWxsID0gZ3VpZGVfbGVnZW5kKCJSZXN1bHRzIikKICApICsgIAogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KAogICAgICBmYWNlID0gImJvbGQiLAogICAgICBzaXplID0gMTEKICAgICksCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICBmYWNlID0gImJvbGQiLAogICAgICBzaXplID0gMTEKICAgICksCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoCiAgICAgIGZhY2UgPSAiYm9sZCIsCiAgICAgIHNpemUgPSAxMQogICAgKQogICkKCnBsb3QxCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KZ2dzYXZlKAogICIuLzAyX291dHB1dC9wbG90cy9wbG90MV90eXBlb2ZtYWxhcmlhX2NvbW11bml0aWVzLnBuZyIsCiAgcGxvdDEsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEwLAogIGhlaWdodCA9IDkKKQpgYGAKCgojIyMgQnkgY29tbXVuaXRpZXMsIEluZGlhbmEgYW5kIHR5cGUgb2YgcGxhc21vZGl1bS90aW1lCmBgYHtyfQpwbG90MV9pbmRpYW5hIDwtIGZmaV90b3RhbCAlPiUKICBkcm9wX25hKHBmX3JlY2VudDpwdl9oaXN0b3JpYykgJT4lCiAgbGVmdF9qb2luKAogICAgY29tbXVuaXRpZXNfZGlzdGFuY2VzCiAgKSAgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IHBmX3JlY2VudDpwdl9oaXN0b3JpYywKICAgIG5hbWVzX3RvID0gIm1hbGFyaWEiLAogICAgdmFsdWVzX3RvID0gInJlc3VsdF9tYWxhcmlhIgogICkgJT4lCiAgbXV0YXRlKAogICAgbWFsYXJpYSA9IGNhc2Vfd2hlbigKICAgICAgbWFsYXJpYSA9PSAicGZfcmVjZW50IiB+ICJSZWNlbnQgUC4gRmFsY2lwYXJ1bSIsCiAgICAgIG1hbGFyaWEgPT0gInBmX2hpc3RvcmljIiB+ICJIaXN0b3JpY2FsIFAuIEZhbGNpcGFydW0iLAogICAgICBtYWxhcmlhID09ICJwdl9yZWNlbnQiIH4gIlJlY2VudCBQLiBWaXZheCIsCiAgICAgIG1hbGFyaWEgPT0gInB2X2hpc3RvcmljIiB+ICJIaXN0b3JpY2FsIFAuIFZpdmF4IgogICAgKSwKICAgIGZmaV9pc19jb21tdW5pdHkgPSBzdHJfdG9fdGl0bGUoZmZpX2lzX2NvbW11bml0eSkKICApICU+JQogIGZpbHRlcihmZmlfaXNfZGlzdHJpY3QgPT0gIklORElBTkEiKSAlPiUKICBtdXRhdGUoCiAgICBmZmlfaXNfY29tbXVuaXR5ID0gZmN0X3Jlb3JkZXIoCiAgICAgIGZmaV9pc19jb21tdW5pdHksCiAgICAgIGRpc3RhbmNlLAogICAgICAuZGVzYyA9IFRSVUUKICAgICkKICApICU+JQogIGdncGxvdChhZXMoCiAgICB4ID0gZmZpX2lzX2NvbW11bml0eSwKICAgIGZpbGwgPSByZXN1bHRfbWFsYXJpYQogICkpICsKICBmYWNldF93cmFwKHZhcnMobWFsYXJpYSkpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIiwgY29sb3IgPSAiYmxhY2siKSArCiAgY29vcmRfZmxpcCh5bGltID0gYygwLCAwLjI1KSkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKQogICkgKwogICNnZ3NjaTo6c2NhbGVfZmlsbF9sYW5jZXQoKSArCiAgaW5ub3Zhcjo6c2NhbGVfZmlsbF9pbm5vdmEoIm5wciIpICsKICBsYWJzKAogICAgdGl0bGUgPSBzdHJfd3JhcCgiU2Vyb2xvZ2ljYWwgcmVzdWx0cyBieSBwbGFzbW9kaXVtIHR5cGUgb2YgbWFsYXJpYSBpbiB0aGUgSW5kaWFuYSBEaXN0cmljdCIsIDEwMCksCiAgICB4ID0gIkNvbW11bml0aWVzIiwKICAgIHkgPSAiUGVyY2VudGFnZSIKICApICsKICBndWlkZXMoCiAgICBmaWxsID0gZ3VpZGVfbGVnZW5kKCJSZXN1bHRzIikKICApICsgIAogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KAogICAgICBmYWNlID0gImJvbGQiLAogICAgICBzaXplID0gMTEKICAgICksCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICBmYWNlID0gImJvbGQiLAogICAgICBzaXplID0gMTEKICAgICksCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoCiAgICAgIGZhY2UgPSAiYm9sZCIsCiAgICAgIHNpemUgPSAxMQogICAgKQogICkKCnBsb3QxX2luZGlhbmEKYGBgCgpgYGB7ciBldmFsPUZBTFNFfQpnZ3NhdmUoCiAgIi4vMDJfb3V0cHV0L3Bsb3RzL3Bsb3QxX3R5cGVvZm1hbGFyaWFfY29tbXVuaXRpZXNfaW5kaWFuYS5wbmciLAogIHBsb3QxX2luZGlhbmEsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEwLAogIGhlaWdodCA9IDkKKQpgYGAKCgojIyMgQnkgY29tbXVuaXRpZXMsIEJlbGVuIGFuZCB0eXBlIG9mIHBsYXNtb2RpdW0vdGltZQpgYGB7cn0KcGxvdDFfYmVsZW4gPC0gZmZpX3RvdGFsICU+JQogIGRyb3BfbmEocGZfcmVjZW50OnB2X2hpc3RvcmljKSAlPiUKICBsZWZ0X2pvaW4oCiAgICBjb21tdW5pdGllc19kaXN0YW5jZXMKICApICU+JQogIHBpdm90X2xvbmdlcigKICAgIGNvbHMgPSBwZl9yZWNlbnQ6cHZfaGlzdG9yaWMsCiAgICBuYW1lc190byA9ICJtYWxhcmlhIiwKICAgIHZhbHVlc190byA9ICJyZXN1bHRfbWFsYXJpYSIKICApICU+JQogIGZpbHRlcihmZmlfaXNfZGlzdHJpY3QgPT0gIkJFTEVOIikgJT4lCiAgbXV0YXRlKAogICAgbWFsYXJpYSA9IGNhc2Vfd2hlbigKICAgICAgbWFsYXJpYSA9PSAicGZfcmVjZW50IiB+ICJSZWNlbnQgUC4gRmFsY2lwYXJ1bSIsCiAgICAgIG1hbGFyaWEgPT0gInBmX2hpc3RvcmljIiB+ICJIaXN0b3JpY2FsIFAuIEZhbGNpcGFydW0iLAogICAgICBtYWxhcmlhID09ICJwdl9yZWNlbnQiIH4gIlJlY2VudCBQLiBWaXZheCIsCiAgICAgIG1hbGFyaWEgPT0gInB2X2hpc3RvcmljIiB+ICJIaXN0b3JpY2FsIFAuIFZpdmF4IgogICAgKSwKICAgIGZmaV9pc19jb21tdW5pdHkgPSBzdHJfdG9fdGl0bGUoZmZpX2lzX2NvbW11bml0eSksCiAgICBmZmlfaXNfY29tbXVuaXR5ID0gZmN0X3Jlb3JkZXIoCiAgICAgIGZmaV9pc19jb21tdW5pdHksCiAgICAgIGRpc3RhbmNlLAogICAgICAuZGVzYyA9IFRSVUUKICAgICkKICApICU+JQogIGdncGxvdChhZXMoCiAgICB4ID0gZmZpX2lzX2NvbW11bml0eSwKICAgIGZpbGwgPSByZXN1bHRfbWFsYXJpYQogICkpICsKICBmYWNldF93cmFwKHZhcnMobWFsYXJpYSkpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIiwgY29sb3IgPSAiYmxhY2siKSArCiAgY29vcmRfZmxpcCh5bGltID0gYygwLCAwLjI1KSkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKQogICkgKwogICNnZ3NjaTo6c2NhbGVfZmlsbF9sYW5jZXQoKSArCiAgaW5ub3Zhcjo6c2NhbGVfZmlsbF9pbm5vdmEoIm5wciIpICsKICBsYWJzKAogICAgdGl0bGUgPSBzdHJfd3JhcCgiU2Vyb2xvZ2ljYWwgcmVzdWx0cyBieSBwbGFzbW9kaXVtIHR5cGUgb2YgbWFsYXJpYSBpbiB0aGUgQmVsZW4gRGlzdHJpY3QiLCAxMDApLAogICAgeCA9ICJDb21tdW5pdGllcyIsCiAgICB5ID0gIlBlcmNlbnRhZ2UiCiAgKSArCiAgZ3VpZGVzKAogICAgZmlsbCA9IGd1aWRlX2xlZ2VuZCgiUmVzdWx0cyIpCiAgKSArICAKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgZmFjZSA9ICJib2xkIiwKICAgICAgc2l6ZSA9IDExCiAgICApLAogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgZmFjZSA9ICJib2xkIiwKICAgICAgc2l6ZSA9IDExCiAgICApLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICBmYWNlID0gImJvbGQiLAogICAgICBzaXplID0gMTEKICAgICkKICApCgpwbG90MV9iZWxlbgpgYGAKCmBgYHtyIGV2YWw9RkFMU0V9Cmdnc2F2ZSgKICAiLi8wMl9vdXRwdXQvcGxvdHMvcGxvdDFfdHlwZW9mbWFsYXJpYV9jb21tdW5pdGllc19iZWxlbi5wbmciLAogIHBsb3QxX2JlbGVuLAogIGRwaSA9IDMwMCwKICBiZyA9ICJ3aGl0ZSIsCiAgd2lkdGggPSAxMCwKICBoZWlnaHQgPSA5CikKYGBgCgojIyMgQnkgY29tbXVuaXRpZXMsIHR5cGUgb2YgcGxhc21vZGl1bSBleHBvc3VyZQpgYGB7cn0KcGxvdDIgPC0gZmZpX3RvdGFsICU+JQogIGRyb3BfbmEocGZfZXhwb3N1cmUsIHB2X2V4cG9zdXJlKSAlPiUKICBsZWZ0X2pvaW4oCiAgICBjb21tdW5pdGllc19kaXN0YW5jZXMKICApICU+JQogIHBpdm90X2xvbmdlcigKICAgIGNvbHMgPSBwdl9leHBvc3VyZTpwZl9leHBvc3VyZSwKICAgIG5hbWVzX3RvID0gImV4cG9zdXJlIiwKICAgIHZhbHVlc190byA9ICJyZXN1bHRfZXhwb3N1cmUiCiAgKSAgJT4lCiAgbXV0YXRlKAogICAgZXhwb3N1cmUgPSBjYXNlX3doZW4oCiAgICAgICAgIGV4cG9zdXJlID09ICJwdl9leHBvc3VyZSIgfiAiUC4gVml2YXggRXhwb3N1cmUiLAogICAgICAgICBleHBvc3VyZSA9PSAicGZfZXhwb3N1cmUiIH4gIlAuIEZhbGNpcGFydW0gRXhwb3N1cmUiCiAgICApLAogICAgZmZpX2lzX2NvbW11bml0eSA9IHN0cl90b190aXRsZShmZmlfaXNfY29tbXVuaXR5KSwKICAgIGZmaV9pc19jb21tdW5pdHkgPSBmY3RfcmVvcmRlcigKICAgICAgZmZpX2lzX2NvbW11bml0eSwKICAgICAgZGlzdGFuY2UsCiAgICAgIC5kZXNjID0gVFJVRQogICAgKQogICkgJT4lCiAgZ2dwbG90KGFlcygKICAgIHggPSBmZmlfaXNfY29tbXVuaXR5LAogICAgZmlsbCA9IHJlc3VsdF9leHBvc3VyZQogICkpICsKICBmYWNldF93cmFwKHZhcnMoZXhwb3N1cmUpKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIsIGNvbG9yID0gImJsYWNrIikgKwogIGNvb3JkX2ZsaXAoeWxpbSA9IGMoMCwgMC40MCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KCkKICApICsKICAjIGdnc2NpOjpzY2FsZV9maWxsX2xhbmNldCgpICsKICBpbm5vdmFyOjpzY2FsZV9maWxsX2lubm92YSgibnByIikgKwogIGxhYnMoCiAgICB4ID0gIkNvbW11bml0aWVzIiwKICAgIHkgPSAiUGVyY2VudGFnZSIKICApICsKICBndWlkZXMoCiAgICBmaWxsID0gZ3VpZGVfbGVnZW5kKCJSZXN1bHRzIikKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgZmFjZSA9ICJib2xkIiwKICAgICAgc2l6ZSA9IDExCiAgICApLAogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgZmFjZSA9ICJib2xkIiwKICAgICAgc2l6ZSA9IDExCiAgICApLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICBmYWNlID0gImJvbGQiLAogICAgICBzaXplID0gMTEKICAgICkKICApCgpwbG90MgpgYGAKCmBgYHtyIGV2YWw9RkFMU0V9Cmdnc2F2ZSgKICAiLi8wMl9vdXRwdXQvcGxvdHMvcGxvdDJfdHlwZW9mbWFsYXJpYV9jb21tdW5pdGllcy5wbmciLAogIHBsb3QyLAogIGRwaSA9IDMwMCwKICBiZyA9ICJ3aGl0ZSIsCiAgd2lkdGggPSAxMCwKICBoZWlnaHQgPSA5CikKYGBgCgojIyMgQnkgY29tbXVuaXRpZXMsIHRpbWUgb2YgcGxhc21vZGl1bSBleHBvc3VyZQpgYGB7cn0KcGxvdDMgPC0gZmZpX3RvdGFsICU+JQogIGRyb3BfbmEocmVjZW50X2V4cG9zdXJlLCBoaXN0b3JpY2FsX2V4cG9zdXJlKSAlPiUKICBsZWZ0X2pvaW4oCiAgICBjb21tdW5pdGllc19kaXN0YW5jZXMKICApICU+JQogIHBpdm90X2xvbmdlcigKICAgIGNvbHMgPSByZWNlbnRfZXhwb3N1cmU6aGlzdG9yaWNhbF9leHBvc3VyZSwKICAgIG5hbWVzX3RvID0gImV4cG9zdXJlIiwKICAgIHZhbHVlc190byA9ICJyZXN1bHRfZXhwb3N1cmUiCiAgKSAlPiUKICBtdXRhdGUoCiAgICBleHBvc3VyZSA9IGNhc2Vfd2hlbigKICAgICAgZXhwb3N1cmUgPT0gInJlY2VudF9leHBvc3VyZSIgfiAiUmVjZW50IEV4cG9zdXJlIiwKICAgICAgZXhwb3N1cmUgPT0gImhpc3RvcmljYWxfZXhwb3N1cmUiIH4gIkhpc3RvcmljYWwgRXhwb3N1cmUiCiAgICApLAogICAgZmZpX2lzX2NvbW11bml0eSA9IHN0cl90b190aXRsZShmZmlfaXNfY29tbXVuaXR5KSwKICAgIGZmaV9pc19jb21tdW5pdHkgPSBmY3RfcmVvcmRlcigKICAgICAgZmZpX2lzX2NvbW11bml0eSwKICAgICAgZGlzdGFuY2UsCiAgICAgIC5kZXNjID0gVFJVRQogICAgKQogICkgJT4lCiAgZ2dwbG90KGFlcygKICAgIHggPSBmZmlfaXNfY29tbXVuaXR5LAogICAgZmlsbCA9IHJlc3VsdF9leHBvc3VyZQogICkpICsKICBmYWNldF93cmFwKHZhcnMoZXhwb3N1cmUpKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIsIGNvbG9yID0gImJsYWNrIikgKwogIGNvb3JkX2ZsaXAoeWxpbSA9IGMoMCwgMC4zMCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KCkKICApICsKICAjIGdnc2NpOjpzY2FsZV9maWxsX2xhbmNldCgpICsKICBpbm5vdmFyOjpzY2FsZV9maWxsX2lubm92YSgibnByIikgKwogIGxhYnMoCiAgICB4ID0gIkNvbW11bml0aWVzIiwKICAgIHkgPSAiUGVyY2VudGFnZSIKICApICsKICBndWlkZXMoCiAgICBmaWxsID0gZ3VpZGVfbGVnZW5kKCJSZXN1bHRzIikKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dCgKICAgICAgZmFjZSA9ICJib2xkIiwKICAgICAgc2l6ZSA9IDExCiAgICApLAogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgZmFjZSA9ICJib2xkIiwKICAgICAgc2l6ZSA9IDExCiAgICApLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KAogICAgICBmYWNlID0gImJvbGQiLAogICAgICBzaXplID0gMTEKICAgICkKICApCgpwbG90MwpgYGAKCmBgYHtyIGV2YWw9RkFMU0V9Cmdnc2F2ZSgKICAiLi8wMl9vdXRwdXQvcGxvdHMvcGxvdDNfdHlwZW9mbWFsYXJpYV9jb21tdW5pdGllcy5wbmciLAogIHBsb3QzLAogIGRwaSA9IDMwMCwKICBiZyA9ICJ3aGl0ZSIsCiAgd2lkdGggPSAxMCwKICBoZWlnaHQgPSA5CikKYGBgCgoKYGBge3J9CiMgZmZpX3RvdGFsICU+JQojICAgZHJvcF9uYShwZl9yZWNlbnQ6cHZfaGlzdG9yaWMsIGFnZV9jYXQpICU+JQojICAgcGl2b3RfbG9uZ2VyKAojICAgICBjb2xzID0gcGZfcmVjZW50OnB2X2hpc3RvcmljLAojICAgICBuYW1lc190byA9ICJtYWxhcmlhIiwKIyAgICAgdmFsdWVzX3RvID0gInJlc3VsdF9tYWxhcmlhIgojICAgKSAlPiUKIyAgIG11dGF0ZSgKIyAgICAgcmVzdWx0X21hbGFyaWEgPSBjYXNlX3doZW4oCiMgICAgICAgcmVzdWx0X21hbGFyaWEgPT0gIlBvc2l0aXZlIiB+IDEsCiMgICAgICAgVFJVRSB+IDAKIyAgICAgKSwKIyAgICAgbWFsYXJpYSA9IGNhc2Vfd2hlbigKIyAgICAgICBtYWxhcmlhID09ICJwZl9yZWNlbnQiIH4gIlJlY2VudCBQLiBGYWxjaXBhcnVtIiwKIyAgICAgICBtYWxhcmlhID09ICJwZl9oaXN0b3JpYyIgfiAiSGlzdG9yaWNhbCBQLiBGYWxjaXBhcnVtIiwKIyAgICAgICBtYWxhcmlhID09ICJwdl9yZWNlbnQiIH4gIlJlY2VudCBQLiBWaXZheCIsCiMgICAgICAgbWFsYXJpYSA9PSAicHZfaGlzdG9yaWMiIH4gIkhpc3RvcmljYWwgUC4gVml2YXgiCiMgICAgICksCiMgICAgIGZmaV9pc19jb21tdW5pdHkgPSBzdHJfdG9fdGl0bGUoZmZpX2lzX2NvbW11bml0eSkKIyAgICkgJT4lCiMgICBncm91cF9ieShmZmlfaXNfY29tbXVuaXR5LCBhZ2VfY2F0LCBtYWxhcmlhKSAlPiUKIyAgIHN1bW1hcmlzZShyZXN1bHRfbWFsYXJpYSA9IG1lYW4ocmVzdWx0X21hbGFyaWEpKSAlPiUKIyAgIGdncGxvdCgKIyAgICAgYWVzKAojICAgICAgIHggPSBhZ2VfY2F0LAojICAgICAgIHkgPSByZXN1bHRfbWFsYXJpYSwKIyAgICAgICBjb2xvciA9IG1hbGFyaWEsCiMgICAgICAgZ3JvdXAgPSBtYWxhcmlhCiMgICAgICkKIyAgICkgKwojICAgZ2VvbV9wb2ludCgpICsKIyAgIGdlb21fbGluZSgpICsKIyAgIGZhY2V0X3dyYXAodmFycyhmZmlfaXNfY29tbXVuaXR5KSkgKwojICAgdGhlbWVfYncoKQpgYGAKCiMjIFNlcm9wb3NpdGl2aXR5IDQgbWFsYXJpYQoKIyMjIEJ5IGRpc3RyaWN0CmBgYHtyfQpzZXJvXzRtYWxhcmlhX2Rpc3RyaWN0IDwtIGZmaV90b3RhbCAlPiUKICBkcm9wX25hKHBmX3JlY2VudDpwdl9oaXN0b3JpYywgYWdlX2NhdCkgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IHBmX3JlY2VudDpwdl9oaXN0b3JpYywKICAgIG5hbWVzX3RvID0gIm1hbGFyaWEiLAogICAgdmFsdWVzX3RvID0gInJlc3VsdF9tYWxhcmlhIgogICkgJT4lCiAgbXV0YXRlKAogICAgcmVzdWx0X21hbGFyaWEgPSBjYXNlX3doZW4oCiAgICAgIHJlc3VsdF9tYWxhcmlhID09ICJQb3NpdGl2ZSIgfiAxLAogICAgICBUUlVFIH4gMAogICAgKSwKICAgIG1hbGFyaWEgPSBjYXNlX3doZW4oCiAgICAgIG1hbGFyaWEgPT0gInBmX3JlY2VudCIgfiAiUmVjZW50IFAuIEZhbGNpcGFydW0iLAogICAgICBtYWxhcmlhID09ICJwZl9oaXN0b3JpYyIgfiAiSGlzdG9yaWNhbCBQLiBGYWxjaXBhcnVtIiwKICAgICAgbWFsYXJpYSA9PSAicHZfcmVjZW50IiB+ICJSZWNlbnQgUC4gVml2YXgiLAogICAgICBtYWxhcmlhID09ICJwdl9oaXN0b3JpYyIgfiAiSGlzdG9yaWNhbCBQLiBWaXZheCIKICAgICksCiAgICBhY3Jvc3MoCiAgICAgIGMoZmZpX2lzX2NvbW11bml0eTpmZmlfaXNfaGVhbHRoX2ZhY2lsaXR5X25hbWUpLAogICAgICBzdHJfdG9fdGl0bGUKICAgICkKICApICU+JQogIGdyb3VwX2J5KGZmaV9pc19kaXN0cmljdCwgYWdlX2NhdCwgbWFsYXJpYSkgJT4lCiAgc3VtbWFyaXNlKHJlc3VsdF9tYWxhcmlhID0gbWVhbihyZXN1bHRfbWFsYXJpYSkpICU+JQogIGdncGxvdCgKICAgIGFlcygKICAgICAgeCA9IGFnZV9jYXQsCiAgICAgIHkgPSByZXN1bHRfbWFsYXJpYSwKICAgICAgY29sb3IgPSBtYWxhcmlhLAogICAgICBncm91cCA9IG1hbGFyaWEKICAgICkKICApICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZSgpICsKICBmYWNldF93cmFwKHZhcnMoZmZpX2lzX2Rpc3RyaWN0KSkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKSwKICAgIGxpbWl0cyA9IGMoMCwgMC40MCkKICApICsKICBsYWJzKAogICAgeCA9ICJBZ2UiLAogICAgeSA9ICJTZXJvcG9zaXRpdml0eSIKICApICsKICBndWlkZXMoCiAgICBjb2xvciA9IGd1aWRlX2xlZ2VuZCgiTWFsYXJpYSIpCiAgKSArCiAgaW5ub3Zhcjo6c2NhbGVfY29sb3JfaW5ub3ZhKCJucHIiKSArCiAgdGhlbWVfYncoKQoKc2Vyb180bWFsYXJpYV9kaXN0cmljdApgYGAKCmBgYHtyIGV2YWw9RkFMU0V9Cmdnc2F2ZSgKICAiLi8wMl9vdXRwdXQvcGxvdHMvcGxvdDRfc2Vyb180bWFsYXJpYV9kaXN0cmljdC5wbmciLAogIHNlcm9fNG1hbGFyaWFfZGlzdHJpY3QsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDcuNQopCmBgYAoKCiMjIyBCeSBIZWFsdGggRmFjaWxpdHkKCmBgYHtyfQpzZXJvXzRtYWxhcmlhX2hmIDwtIGZmaV90b3RhbCAlPiUKICBkcm9wX25hKHBmX3JlY2VudDpwdl9oaXN0b3JpYywgYWdlX2NhdCkgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IHBmX3JlY2VudDpwdl9oaXN0b3JpYywKICAgIG5hbWVzX3RvID0gIm1hbGFyaWEiLAogICAgdmFsdWVzX3RvID0gInJlc3VsdF9tYWxhcmlhIgogICkgJT4lCiAgbXV0YXRlKAogICAgcmVzdWx0X21hbGFyaWEgPSBjYXNlX3doZW4oCiAgICAgIHJlc3VsdF9tYWxhcmlhID09ICJQb3NpdGl2ZSIgfiAxLAogICAgICBUUlVFIH4gMAogICAgKSwKICAgIG1hbGFyaWEgPSBjYXNlX3doZW4oCiAgICAgIG1hbGFyaWEgPT0gInBmX3JlY2VudCIgfiAiUmVjZW50IFAuIEZhbGNpcGFydW0iLAogICAgICBtYWxhcmlhID09ICJwZl9oaXN0b3JpYyIgfiAiSGlzdG9yaWNhbCBQLiBGYWxjaXBhcnVtIiwKICAgICAgbWFsYXJpYSA9PSAicHZfcmVjZW50IiB+ICJSZWNlbnQgUC4gVml2YXgiLAogICAgICBtYWxhcmlhID09ICJwdl9oaXN0b3JpYyIgfiAiSGlzdG9yaWNhbCBQLiBWaXZheCIKICAgICksCiAgICBhY3Jvc3MoCiAgICAgIGMoZmZpX2lzX2NvbW11bml0eTpmZmlfaXNfaGVhbHRoX2ZhY2lsaXR5X25hbWUpLAogICAgICBzdHJfdG9fdGl0bGUKICAgICksCiAgICBmZmlfaXNfaGVhbHRoX2ZhY2lsaXR5X25hbWUgPSBwYXN0ZSgKICAgICAgZmZpX2lzX2Rpc3RyaWN0LAogICAgICBmZmlfaXNfaGVhbHRoX2ZhY2lsaXR5X25hbWUsCiAgICAgIHNlcCA9ICIgLSAiCiAgICApCiAgKSAlPiUKICBncm91cF9ieShmZmlfaXNfaGVhbHRoX2ZhY2lsaXR5X25hbWUsIGFnZV9jYXQsIG1hbGFyaWEpICU+JQogIHN1bW1hcmlzZShyZXN1bHRfbWFsYXJpYSA9IG1lYW4ocmVzdWx0X21hbGFyaWEpKSAlPiUKICBnZ3Bsb3QoCiAgICBhZXMoCiAgICAgIHggPSBhZ2VfY2F0LAogICAgICB5ID0gcmVzdWx0X21hbGFyaWEsCiAgICAgIGNvbG9yID0gbWFsYXJpYSwKICAgICAgZ3JvdXAgPSBtYWxhcmlhCiAgICApCiAgKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoKSArCiAgZmFjZXRfd3JhcCh2YXJzKGZmaV9pc19oZWFsdGhfZmFjaWxpdHlfbmFtZSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KCkKICApICsKICBsYWJzKAogICAgeCA9ICJBZ2UiLAogICAgeSA9ICJTZXJvcG9zaXRpdml0eSIKICApICsKICBndWlkZXMoCiAgICBjb2xvciA9IGd1aWRlX2xlZ2VuZCgiTWFsYXJpYSIpCiAgKSArCiAgaW5ub3Zhcjo6c2NhbGVfY29sb3JfaW5ub3ZhKCJucHIiKSArIAogIHRoZW1lX2J3KCkgKwogIHRoZW1lKAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICAgIGFuZ2xlID0gNDUsCiAgICAgIHZqdXN0ID0gMSwKICAgICAgaGp1c3QgPSAxCiAgICApCiAgKQogIApzZXJvXzRtYWxhcmlhX2hmCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KZ2dzYXZlKAogICIuLzAyX291dHB1dC9wbG90cy9wbG90NV9zZXJvXzRtYWxhcmlhX2hmLnBuZyIsCiAgc2Vyb180bWFsYXJpYV9oZiwKICBkcGkgPSAzMDAsCiAgYmcgPSAid2hpdGUiLAogIHdpZHRoID0gMTAsCiAgaGVpZ2h0ID0gNwopCmBgYAoKIyMgU2VvcG9zaXRpdml0eSBieSBUeXBlIG9mIE1hbGFyaWEKCiMjIyBCeSBEaXN0cmljdAoKYGBge3J9CmZmaV90eXBlb2ZfbWFsYXJpYSA8LSBmZmlfdG90YWwgJT4lCiAgZHJvcF9uYShwZl9leHBvc3VyZSwgcHZfZXhwb3N1cmUsIGFnZV9jYXQpICU+JQogIHBpdm90X2xvbmdlcigKICAgIGNvbHMgPSBwdl9leHBvc3VyZTpwZl9leHBvc3VyZSwKICAgIG5hbWVzX3RvID0gImV4cG9zdXJlIiwKICAgIHZhbHVlc190byA9ICJyZXN1bHRfZXhwb3N1cmUiCiAgKSAlPiUKICBtdXRhdGUoCiAgICBleHBvc3VyZSA9IGNhc2Vfd2hlbigKICAgICAgZXhwb3N1cmUgPT0gInB2X2V4cG9zdXJlIiB+ICJQLiBWaXZheCBFeHBvc3VyZSIsCiAgICAgIGV4cG9zdXJlID09ICJwZl9leHBvc3VyZSIgfiAiUC4gRmFsY2lwYXJ1bSBFeHBvc3VyZSIKICAgICksCiAgICByZXN1bHRfZXhwb3N1cmUgPSBjYXNlX3doZW4oCiAgICAgIHJlc3VsdF9leHBvc3VyZSA9PSAiUG9zaXRpdmUiIH4gMSwKICAgICAgVFJVRSB+IDAKICAgICksCiAgICBhY3Jvc3MoCiAgICAgIGMoZmZpX2lzX2NvbW11bml0eTpmZmlfaXNfaGVhbHRoX2ZhY2lsaXR5X25hbWUpLAogICAgICBzdHJfdG9fdGl0bGUKICAgICkKICApCgpzZXJvX3R5cGVvZm1hbGFyaWFfZGlzdHJpY3QgPC0gZmZpX3R5cGVvZl9tYWxhcmlhICU+JQogIGdyb3VwX2J5KGZmaV9pc19kaXN0cmljdCwgYWdlX2NhdCwgZXhwb3N1cmUpICU+JQogIHN1bW1hcmlzZShyZXN1bHRfZXhwb3N1cmUgPSBtZWFuKHJlc3VsdF9leHBvc3VyZSkpICU+JQogIGdncGxvdCgKICAgIGFlcygKICAgICAgeCA9IGFnZV9jYXQsCiAgICAgIHkgPSByZXN1bHRfZXhwb3N1cmUsCiAgICAgIGNvbG9yID0gZXhwb3N1cmUsCiAgICAgIGdyb3VwID0gZXhwb3N1cmUKICAgICkKICApICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZSgpICsKICBmYWNldF93cmFwKHZhcnMoZmZpX2lzX2Rpc3RyaWN0KSkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKSwKICAgIGxpbWl0cyA9IGMoMCwgMC40MCkKICApICsKICBsYWJzKAogICAgeCA9ICJBZ2UiLAogICAgeSA9ICJTZXJvcG9zaXRpdml0eSIKICApICsKICBndWlkZXMoCiAgICBjb2xvciA9IGd1aWRlX2xlZ2VuZCgiTWFsYXJpYSIpCiAgKSArCiAgaW5ub3Zhcjo6c2NhbGVfY29sb3JfaW5ub3ZhKCJucHIiKSArCiAgdGhlbWVfYncoKQpgYGAKCmBgYHtyIGV2YWw9RkFMU0V9Cmdnc2F2ZSgKICAiLi8wMl9vdXRwdXQvcGxvdHMvcGxvdDZfc2Vyb190eXBlb2ZtYWxhcmlhX2Rpc3RyaWN0LnBuZyIsCiAgc2Vyb190eXBlb2ZtYWxhcmlhX2Rpc3RyaWN0LAogIGRwaSA9IDMwMCwKICBiZyA9ICJ3aGl0ZSIsCiAgd2lkdGggPSAxMiwKICBoZWlnaHQgPSA3LjUKKQpgYGAKCiMjIyBCeSBIZWFsdGggRmFjaWxpdHkKCmBgYHtyfQpzZXJvX3R5cGVvZm1hbGFyaWFfaGYgPC0gZmZpX3R5cGVvZl9tYWxhcmlhICU+JQogIGdyb3VwX2J5KGZmaV9pc19oZWFsdGhfZmFjaWxpdHlfbmFtZSwgYWdlX2NhdCwgZXhwb3N1cmUpICU+JQogIHN1bW1hcmlzZShyZXN1bHRfZXhwb3N1cmUgPSBtZWFuKHJlc3VsdF9leHBvc3VyZSkpICU+JQogIGdncGxvdCgKICAgIGFlcygKICAgICAgeCA9IGFnZV9jYXQsCiAgICAgIHkgPSByZXN1bHRfZXhwb3N1cmUsCiAgICAgIGNvbG9yID0gZXhwb3N1cmUsCiAgICAgIGdyb3VwID0gZXhwb3N1cmUKICAgICkKICApICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZSgpICsKICBmYWNldF93cmFwKHZhcnMoZmZpX2lzX2hlYWx0aF9mYWNpbGl0eV9uYW1lKSkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKQogICkgKwogIGxhYnMoCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IgogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpCgpzZXJvX3R5cGVvZm1hbGFyaWFfaGYKYGBgCgpgYGB7ciBldmFsPUZBTFNFfQpnZ3NhdmUoCiAgIi4vMDJfb3V0cHV0L3Bsb3RzL3Bsb3Q3X3Nlcm9fdHlwZW9mbWFsYXJpYV9oZi5wbmciLAogIHNlcm9fdHlwZW9mbWFsYXJpYV9oZiwKICBkcGkgPSAzMDAsCiAgYmcgPSAid2hpdGUiLAogIHdpZHRoID0gMTMsCiAgaGVpZ2h0ID0gOQopCmBgYAoKIyMgU2Vyb3Bvc2l0aXZpdHkgYnkgVGltZSBvZiBFeHBvc3VyZSAKCiMjIyBCeSBEaXN0cmljdApgYGB7cn0KZmZpX3RpbWVvZm1hbGFyaWEgPC0gZmZpX3RvdGFsICU+JQogIGRyb3BfbmEocmVjZW50X2V4cG9zdXJlLCBoaXN0b3JpY2FsX2V4cG9zdXJlLCBhZ2VfY2F0KSAlPiUKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gcmVjZW50X2V4cG9zdXJlOmhpc3RvcmljYWxfZXhwb3N1cmUsCiAgICBuYW1lc190byA9ICJleHBvc3VyZSIsCiAgICB2YWx1ZXNfdG8gPSAicmVzdWx0X2V4cG9zdXJlIgogICkgJT4lCiAgbXV0YXRlKAogICAgZXhwb3N1cmUgPSBjYXNlX3doZW4oCiAgICAgIGV4cG9zdXJlID09ICJyZWNlbnRfZXhwb3N1cmUiIH4gIlJlY2VudCBFeHBvc3VyZSIsCiAgICAgIGV4cG9zdXJlID09ICJoaXN0b3JpY2FsX2V4cG9zdXJlIiB+ICJIaXN0b3JpY2FsIEV4cG9zdXJlIgogICAgKSwKICAgIHJlc3VsdF9leHBvc3VyZSA9IGNhc2Vfd2hlbigKICAgICAgcmVzdWx0X2V4cG9zdXJlID09ICJQb3NpdGl2ZSIgfiAxLAogICAgICBUUlVFIH4gMAogICAgKSwKICAgIGFjcm9zcygKICAgICAgYyhmZmlfaXNfY29tbXVuaXR5OmZmaV9pc19oZWFsdGhfZmFjaWxpdHlfbmFtZSksCiAgICAgIHN0cl90b190aXRsZQogICAgKQogICkKCnNlcm9fdGltZW9mbWFsYXJpYV9kaXN0cmljdCA8LSBmZmlfdGltZW9mbWFsYXJpYSAlPiUKICBncm91cF9ieShmZmlfaXNfZGlzdHJpY3QsIGFnZV9jYXQsIGV4cG9zdXJlKSAlPiUKICBzdW1tYXJpc2UocmVzdWx0X2V4cG9zdXJlID0gbWVhbihyZXN1bHRfZXhwb3N1cmUpKSAlPiUKICBnZ3Bsb3QoCiAgICBhZXMoCiAgICAgIHggPSBhZ2VfY2F0LAogICAgICB5ID0gcmVzdWx0X2V4cG9zdXJlLAogICAgICBjb2xvciA9IGV4cG9zdXJlLAogICAgICBncm91cCA9IGV4cG9zdXJlCiAgICApCiAgKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoKSArCiAgZmFjZXRfd3JhcCh2YXJzKGZmaV9pc19kaXN0cmljdCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KCksCiAgICBsaW1pdHMgPSBjKDAsIDAuNDApCiAgKSArCiAgbGFicygKICAgIHggPSAiQWdlIiwKICAgIHkgPSAiU2Vyb3Bvc2l0aXZpdHkiCiAgKSArCiAgZ3VpZGVzKAogICAgY29sb3IgPSBndWlkZV9sZWdlbmQoIk1hbGFyaWEiKQogICkgKwogIGlubm92YXI6OnNjYWxlX2NvbG9yX2lubm92YSgibnByIikgKwogIHRoZW1lX2J3KCkKYGBgCgpgYGB7ciBldmFsPUZBTFNFfQpnZ3NhdmUoCiAgIi4vMDJfb3V0cHV0L3Bsb3RzL3Bsb3Q4X3Nlcm9fdGltZW9mbWFsYXJpYV9kaXN0cmljdC5wbmciLAogIHNlcm9fdGltZW9mbWFsYXJpYV9kaXN0cmljdCwKICBkcGkgPSAzMDAsCiAgYmcgPSAid2hpdGUiLAogIHdpZHRoID0gMTIsCiAgaGVpZ2h0ID0gNy41CikKYGBgCgojIyMgQnkgSGVhbHRoIEZhY2lsaXR5CgpgYGB7cn0Kc2Vyb190aW1lb2ZtYWxhcmlhX2hmIDwtIGZmaV90aW1lb2ZtYWxhcmlhICU+JQogIGdyb3VwX2J5KGZmaV9pc19oZWFsdGhfZmFjaWxpdHlfbmFtZSwgYWdlX2NhdCwgZXhwb3N1cmUpICU+JQogIHN1bW1hcmlzZShyZXN1bHRfZXhwb3N1cmUgPSBtZWFuKHJlc3VsdF9leHBvc3VyZSkpICU+JQogIGdncGxvdCgKICAgIGFlcygKICAgICAgeCA9IGFnZV9jYXQsCiAgICAgIHkgPSByZXN1bHRfZXhwb3N1cmUsCiAgICAgIGNvbG9yID0gZXhwb3N1cmUsCiAgICAgIGdyb3VwID0gZXhwb3N1cmUKICAgICkKICApICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZSgpICsKICBmYWNldF93cmFwKHZhcnMoZmZpX2lzX2hlYWx0aF9mYWNpbGl0eV9uYW1lKSkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKQogICkgKwogIGxhYnMoCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IgogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsgCiAgdGhlbWVfYncoKQogIApzZXJvX3RpbWVvZm1hbGFyaWFfaGYKYGBgCgpgYGB7ciBldmFsPUZBTFNFfQpnZ3NhdmUoCiAgIi4vMDJfb3V0cHV0L3Bsb3RzL3Bsb3Q5X3Nlcm9fdGltZW9mbWFsYXJpYV9oZi5wbmciLAogIHNlcm9fdGltZW9mbWFsYXJpYV9oZiwKICBkcGkgPSAzMDAsCiAgYmcgPSAid2hpdGUiLAogIHdpZHRoID0gMTMsCiAgaGVpZ2h0ID0gOQopCmBgYAoKIyMgUmVsYXRpb24gd2l0aCBzZXgKCmBgYHtyfQpsaWJyYXJ5KHJsYW5nKQoKc2Vyb3Bvc2l0aXZ5X3N1bW1hcmlzZSA8LSBmdW5jdGlvbihkYXRhLCB0eXBlLCB2YXJpYWJsZSwgLi4uKSB7CiAgaWYgKHR5cGUgPT0gIjRtYWxhcmlhIikgewogICAgZmZpX3RvdGFsICU+JQogICAgICBkcm9wX25hKHBmX3JlY2VudDpwdl9oaXN0b3JpYywge3sgdmFyaWFibGUgfX0sIC4uLikgJT4lCiAgICAgIHBpdm90X2xvbmdlcigKICAgICAgICBjb2xzID0gcGZfcmVjZW50OnB2X2hpc3RvcmljLAogICAgICAgIG5hbWVzX3RvID0gIm1hbGFyaWEiLAogICAgICAgIHZhbHVlc190byA9ICJyZXN1bHRfbWFsYXJpYSIKICAgICAgKSAlPiUKICAgICAgbXV0YXRlKAogICAgICAgIHJlc3VsdF9tYWxhcmlhID0gY2FzZV93aGVuKAogICAgICAgICAgcmVzdWx0X21hbGFyaWEgPT0gIlBvc2l0aXZlIiB+IDEsCiAgICAgICAgICBUUlVFIH4gMAogICAgICAgICksCiAgICAgICAgbWFsYXJpYSA9IGNhc2Vfd2hlbigKICAgICAgICAgIG1hbGFyaWEgPT0gInBmX3JlY2VudCIgfiAiUmVjZW50IFAuIEZhbGNpcGFydW0iLAogICAgICAgICAgbWFsYXJpYSA9PSAicGZfaGlzdG9yaWMiIH4gIkhpc3RvcmljYWwgUC4gRmFsY2lwYXJ1bSIsCiAgICAgICAgICBtYWxhcmlhID09ICJwdl9yZWNlbnQiIH4gIlJlY2VudCBQLiBWaXZheCIsCiAgICAgICAgICBtYWxhcmlhID09ICJwdl9oaXN0b3JpYyIgfiAiSGlzdG9yaWNhbCBQLiBWaXZheCIKICAgICAgICApLAogICAgICAgIGFjcm9zcygKICAgICAgICAgIGMoZmZpX2lzX2NvbW11bml0eTpmZmlfaXNfaGVhbHRoX2ZhY2lsaXR5X25hbWUpLAogICAgICAgICAgc3RyX3RvX3RpdGxlCiAgICAgICAgKQogICAgICApICU+JQogICAgICBncm91cF9ieShmZmlfaXNfZGlzdHJpY3QsIHt7IHZhcmlhYmxlIH19LCAuLi4sIG1hbGFyaWEpICU+JQogICAgICBzdW1tYXJpc2UocmVzdWx0X21hbGFyaWEgPSBtZWFuKHJlc3VsdF9tYWxhcmlhKSkKICB9IGVsc2UgaWYgKHR5cGUgPT0gInR5cGVvZm1hbGFyaWEiICkgewogICAgZmZpX3RvdGFsICU+JQogICAgICBkcm9wX25hKHBmX2V4cG9zdXJlLCBwdl9leHBvc3VyZSwge3sgdmFyaWFibGUgfX0sIC4uLikgJT4lCiAgICAgIHBpdm90X2xvbmdlcigKICAgICAgICBjb2xzID0gcHZfZXhwb3N1cmU6cGZfZXhwb3N1cmUsCiAgICAgICAgbmFtZXNfdG8gPSAiZXhwb3N1cmUiLAogICAgICAgIHZhbHVlc190byA9ICJyZXN1bHRfZXhwb3N1cmUiCiAgICAgICkgJT4lCiAgICAgIG11dGF0ZSgKICAgICAgICBleHBvc3VyZSA9IGNhc2Vfd2hlbigKICAgICAgICAgIGV4cG9zdXJlID09ICJwdl9leHBvc3VyZSIgfiAiUC4gVml2YXggRXhwb3N1cmUiLAogICAgICAgICAgZXhwb3N1cmUgPT0gInBmX2V4cG9zdXJlIiB+ICJQLiBGYWxjaXBhcnVtIEV4cG9zdXJlIgogICAgICAgICksCiAgICAgICAgcmVzdWx0X2V4cG9zdXJlID0gY2FzZV93aGVuKAogICAgICAgICAgcmVzdWx0X2V4cG9zdXJlID09ICJQb3NpdGl2ZSIgfiAxLAogICAgICAgICAgVFJVRSB+IDAKICAgICAgICApLAogICAgICAgIGFjcm9zcygKICAgICAgICAgIGMoZmZpX2lzX2NvbW11bml0eTpmZmlfaXNfaGVhbHRoX2ZhY2lsaXR5X25hbWUpLAogICAgICAgICAgc3RyX3RvX3RpdGxlCiAgICAgICAgKQogICAgICApICU+JQogICAgICBncm91cF9ieShmZmlfaXNfZGlzdHJpY3QsIHt7IHZhcmlhYmxlIH19LCAuLi4sIGV4cG9zdXJlKSAlPiUKICAgICAgc3VtbWFyaXNlKHJlc3VsdF9leHBvc3VyZSA9IG1lYW4ocmVzdWx0X2V4cG9zdXJlKSkKICB9IGVsc2UgaWYgKHR5cGUgPT0gInRpbWVvZm1hbGFyaWEiKSB7CiAgICBmZmlfdG90YWwgJT4lCiAgICAgIGRyb3BfbmEocmVjZW50X2V4cG9zdXJlLCBoaXN0b3JpY2FsX2V4cG9zdXJlLCAKICAgICAgICAgICAgICB7eyB2YXJpYWJsZSB9fSwgLi4uKSAlPiUKICAgICAgcGl2b3RfbG9uZ2VyKAogICAgICAgIGNvbHMgPSByZWNlbnRfZXhwb3N1cmU6aGlzdG9yaWNhbF9leHBvc3VyZSwKICAgICAgICBuYW1lc190byA9ICJleHBvc3VyZSIsCiAgICAgICAgdmFsdWVzX3RvID0gInJlc3VsdF9leHBvc3VyZSIKICAgICAgKSAlPiUKICAgICAgbXV0YXRlKAogICAgICAgIGV4cG9zdXJlID0gY2FzZV93aGVuKAogICAgICAgICAgZXhwb3N1cmUgPT0gInJlY2VudF9leHBvc3VyZSIgfiAiUmVjZW50IEV4cG9zdXJlIiwKICAgICAgICAgIGV4cG9zdXJlID09ICJoaXN0b3JpY2FsX2V4cG9zdXJlIiB+ICJIaXN0b3JpY2FsIEV4cG9zdXJlIgogICAgICAgICksCiAgICAgICAgcmVzdWx0X2V4cG9zdXJlID0gY2FzZV93aGVuKAogICAgICAgICAgcmVzdWx0X2V4cG9zdXJlID09ICJQb3NpdGl2ZSIgfiAxLAogICAgICAgICAgVFJVRSB+IDAKICAgICAgICApLAogICAgICAgIGFjcm9zcygKICAgICAgICAgIGMoZmZpX2lzX2NvbW11bml0eTpmZmlfaXNfaGVhbHRoX2ZhY2lsaXR5X25hbWUpLAogICAgICAgICAgc3RyX3RvX3RpdGxlCiAgICAgICAgKQogICAgICApICU+JQogICAgICBncm91cF9ieShmZmlfaXNfZGlzdHJpY3QsIHt7IHZhcmlhYmxlIH19LCAuLi4sIGV4cG9zdXJlKSAlPiUKICAgICAgc3VtbWFyaXNlKHJlc3VsdF9leHBvc3VyZSA9IG1lYW4ocmVzdWx0X2V4cG9zdXJlKSkgICAgICAKICB9ICAKfQpgYGAKCiMjIyBCeSA0IE1hbGFyaWEKCmBgYHtyfQpzZXJvXzRtYWxhcmlhX2Rpc3RyaWN0X2dlbmRlciA8LSBzZXJvcG9zaXRpdnlfc3VtbWFyaXNlKAogIGZmaV90b3RhbCwKICAiNG1hbGFyaWEiLAogIGFnZV9jYXQsCiAgZ2VuZGVyCikgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gYWdlX2NhdCwKICAgICAgeSA9IHJlc3VsdF9tYWxhcmlhLAogICAgICBjb2xvciA9IG1hbGFyaWEsCiAgICAgIGdyb3VwID0gbWFsYXJpYQogICAgKQogICkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKCkgKwogIGZhY2V0X2dyaWQoCiAgICB2YXJzKGdlbmRlciksCiAgICB2YXJzKGZmaV9pc19kaXN0cmljdCkgICAgCiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLAogICAgbGltaXRzID0gYygwLCAwLjQwKQogICkgKwogIGxhYnMoCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IgogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpCgpzZXJvXzRtYWxhcmlhX2Rpc3RyaWN0X2dlbmRlcgpgYGAKCmBgYHtyIGV2YWw9RkFMU0V9Cmdnc2F2ZSgKICAiLi8wMl9vdXRwdXQvcGxvdHMvcGxvdDEwX3Nlcm9fNG1hbGFyaWFfZGlzdHJpY3RfZ2VuZGVyLnBuZyIsCiAgc2Vyb180bWFsYXJpYV9kaXN0cmljdF9nZW5kZXIsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDguNQopCmBgYAoKIyMjIEJ5IFR5cGUgb2YgTWFsYXJpYQoKYGBge3J9CnNlcm9fdHlwZW9mbWFsYXJpYV9kaXN0cmljdF9nZW5kZXIgPC0gc2Vyb3Bvc2l0aXZ5X3N1bW1hcmlzZSgKICBmZmlfdG90YWwsCiAgInR5cGVvZm1hbGFyaWEiLAogIGFnZV9jYXQsCiAgZ2VuZGVyCikgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gYWdlX2NhdCwKICAgICAgeSA9IHJlc3VsdF9leHBvc3VyZSwKICAgICAgY29sb3IgPSBleHBvc3VyZSwKICAgICAgZ3JvdXAgPSBleHBvc3VyZQogICAgKQogICkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKCkgKwogIGZhY2V0X2dyaWQoCiAgICB2YXJzKGdlbmRlciksCiAgICB2YXJzKGZmaV9pc19kaXN0cmljdCkgICAgCiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLAogICAgbGltaXRzID0gYygwLCAwLjQ1KQogICkgKwogIGxhYnMoCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IgogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpCgpzZXJvX3R5cGVvZm1hbGFyaWFfZGlzdHJpY3RfZ2VuZGVyCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KZ2dzYXZlKAogICIuLzAyX291dHB1dC9wbG90cy9wbG90MTFfc2Vyb190eXBlb2ZtYWxhcmlhX2Rpc3RyaWN0X2dlbmRlci5wbmciLAogIHNlcm9fdHlwZW9mbWFsYXJpYV9kaXN0cmljdF9nZW5kZXIsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDguNQopCmBgYAoKIyMjIEJ5IFRpbWUgb2YgTWFsYXJpYQoKYGBge3J9CnNlcm9fdGltZW9mbWFsYXJpYV9kaXN0cmljdF9nZW5kZXIgPC0gc2Vyb3Bvc2l0aXZ5X3N1bW1hcmlzZSgKICBmZmlfdG90YWwsCiAgInRpbWVvZm1hbGFyaWEiLAogIGFnZV9jYXQsCiAgZ2VuZGVyCikgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gYWdlX2NhdCwKICAgICAgeSA9IHJlc3VsdF9leHBvc3VyZSwKICAgICAgY29sb3IgPSBleHBvc3VyZSwKICAgICAgZ3JvdXAgPSBleHBvc3VyZQogICAgKQogICkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKCkgKwogIGZhY2V0X2dyaWQoCiAgICB2YXJzKGdlbmRlciksCiAgICB2YXJzKGZmaV9pc19kaXN0cmljdCkgICAgCiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLAogICAgbGltaXRzID0gYygwLCAwLjQ1KQogICkgKwogIGxhYnMoCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IgogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpCgpzZXJvX3RpbWVvZm1hbGFyaWFfZGlzdHJpY3RfZ2VuZGVyCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KZ2dzYXZlKAogICIuLzAyX291dHB1dC9wbG90cy9wbG90MTJfc2Vyb190aW1lb2ZtYWxhcmlhX2Rpc3RyaWN0X2dlbmRlci5wbmciLAogIHNlcm9fdGltZW9mbWFsYXJpYV9kaXN0cmljdF9nZW5kZXIsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDguNQopCmBgYAoKIyMgUmVsYXRpb24gd2l0aCBFZHVjYXRpb24gTGV2ZWwKCiMjIyBCeSA0IE1hbGFyaWEKCmBgYHtyfQpzZXJvXzRtYWxhcmlhX2Rpc3RyaWN0X2VkdWxldmVsIDwtIHNlcm9wb3NpdGl2eV9zdW1tYXJpc2UoCiAgZmZpX3RvdGFsLAogICI0bWFsYXJpYSIsCiAgYWdlX2NhdCwKICBlZHVjYXRpb25fbGV2ZWwKKSAlPiUKICBnZ3Bsb3QoCiAgICBhZXMoCiAgICAgIHggPSBhZ2VfY2F0LAogICAgICB5ID0gcmVzdWx0X21hbGFyaWEsCiAgICAgIGNvbG9yID0gbWFsYXJpYSwKICAgICAgZ3JvdXAgPSBtYWxhcmlhCiAgICApCiAgKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoKSArCiAgZmFjZXRfZ3JpZCgKICAgIHZhcnMoZWR1Y2F0aW9uX2xldmVsKSwKICAgIHZhcnMoZmZpX2lzX2Rpc3RyaWN0KSAgICAKICApICsKICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KCksCiAgICAjbGltaXRzID0gYygwLCAwLjQwKQogICkgKwogIGxhYnMoCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IgogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpCgpzZXJvXzRtYWxhcmlhX2Rpc3RyaWN0X2VkdWxldmVsCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KZ2dzYXZlKAogICIuLzAyX291dHB1dC9wbG90cy9wbG90MTNfc2Vyb180bWFsYXJpYV9kaXN0cmljdF9lZHVsZXZlbC5wbmciLAogIHNlcm9fNG1hbGFyaWFfZGlzdHJpY3RfZWR1bGV2ZWwsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDguNQopCmBgYAoKIyMjIEJ5IFR5cGUgb2YgTWFsYXJpYQoKYGBge3J9CnNlcm9fdHlwZW9mbWFsYXJpYV9kaXN0cmljdF9lZHVsZXZlbCA8LSBzZXJvcG9zaXRpdnlfc3VtbWFyaXNlKAogIGZmaV90b3RhbCwKICAidHlwZW9mbWFsYXJpYSIsCiAgYWdlX2NhdCwKICBlZHVjYXRpb25fbGV2ZWwKKSAlPiUKICBnZ3Bsb3QoCiAgICBhZXMoCiAgICAgIHggPSBhZ2VfY2F0LAogICAgICB5ID0gcmVzdWx0X2V4cG9zdXJlLAogICAgICBjb2xvciA9IGV4cG9zdXJlLAogICAgICBncm91cCA9IGV4cG9zdXJlCiAgICApCiAgKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoKSArCiAgZmFjZXRfZ3JpZCgKICAgIHZhcnMoZWR1Y2F0aW9uX2xldmVsKSwKICAgIHZhcnMoZmZpX2lzX2Rpc3RyaWN0KSAgICAKICApICsKICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KCksCiAgICAjbGltaXRzID0gYygwLCAwLjQ1KQogICkgKwogIGxhYnMoCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IgogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpCgpzZXJvX3R5cGVvZm1hbGFyaWFfZGlzdHJpY3RfZWR1bGV2ZWwKYGBgCgpgYGB7ciBldmFsPUZBTFNFfQpnZ3NhdmUoCiAgIi4vMDJfb3V0cHV0L3Bsb3RzL3Bsb3QxNF9zZXJvX3R5cGVvZm1hbGFyaWFfZGlzdHJpY3RfZWR1bGV2ZWwucG5nIiwKICBzZXJvX3R5cGVvZm1hbGFyaWFfZGlzdHJpY3RfZWR1bGV2ZWwsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDguNQopCmBgYAoKIyMjIEJ5IFRpbWUgb2YgTWFsYXJpYQoKYGBge3J9CnNlcm9fdGltZW9mbWFsYXJpYV9kaXN0cmljdF9lZHVsZXZlbCA8LSBzZXJvcG9zaXRpdnlfc3VtbWFyaXNlKAogIGZmaV90b3RhbCwKICAidGltZW9mbWFsYXJpYSIsCiAgYWdlX2NhdCwKICBlZHVjYXRpb25fbGV2ZWwKKSAlPiUKICBnZ3Bsb3QoCiAgICBhZXMoCiAgICAgIHggPSBhZ2VfY2F0LAogICAgICB5ID0gcmVzdWx0X2V4cG9zdXJlLAogICAgICBjb2xvciA9IGV4cG9zdXJlLAogICAgICBncm91cCA9IGV4cG9zdXJlCiAgICApCiAgKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoKSArCiAgZmFjZXRfZ3JpZCgKICAgIHZhcnMoZWR1Y2F0aW9uX2xldmVsKSwKICAgIHZhcnMoZmZpX2lzX2Rpc3RyaWN0KSAgICAKICApICsKICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KCksCiAgICAjbGltaXRzID0gYygwLCAwLjQ1KQogICkgKwogIGxhYnMoCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IgogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpCgpzZXJvX3RpbWVvZm1hbGFyaWFfZGlzdHJpY3RfZWR1bGV2ZWwKYGBgCgpgYGB7ciBldmFsPUZBTFNFfQpnZ3NhdmUoCiAgIi4vMDJfb3V0cHV0L3Bsb3RzL3Bsb3QxNV9zZXJvX3RpbWVvZm1hbGFyaWFfZGlzdHJpY3RfZWR1bGV2ZWwucG5nIiwKICBzZXJvX3RpbWVvZm1hbGFyaWFfZGlzdHJpY3RfZWR1bGV2ZWwsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDguNQopCmBgYAoKIyMgUmVsYXRpb24gd2l0aCBGZXZlciBNb250aAoKIyMjIyBCeSA0IG1hbGFyaWEKYGBge3J9CmZmaV9mZXZlcl9tb250aCA8LSBmZmlfdG90YWwgJT4lCiAgZHJvcF9uYShwZl9yZWNlbnQ6cHZfaGlzdG9yaWMsIGFnZV9jYXQsIGZmaV9pc19mZXZlcl9tb250aCkgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IHBmX3JlY2VudDpwdl9oaXN0b3JpYywKICAgIG5hbWVzX3RvID0gIm1hbGFyaWEiLAogICAgdmFsdWVzX3RvID0gInJlc3VsdF9tYWxhcmlhIgogICkgJT4lCiAgbXV0YXRlKAogICAgcmVzdWx0X21hbGFyaWEgPSBjYXNlX3doZW4oCiAgICAgIHJlc3VsdF9tYWxhcmlhID09ICJQb3NpdGl2ZSIgfiAxLAogICAgICBUUlVFIH4gMAogICAgKSwKICAgIG1hbGFyaWEgPSBjYXNlX3doZW4oCiAgICAgIG1hbGFyaWEgPT0gInBmX3JlY2VudCIgfiAiUmVjZW50IFAuIEZhbGNpcGFydW0iLAogICAgICBtYWxhcmlhID09ICJwZl9oaXN0b3JpYyIgfiAiSGlzdG9yaWNhbCBQLiBGYWxjaXBhcnVtIiwKICAgICAgbWFsYXJpYSA9PSAicHZfcmVjZW50IiB+ICJSZWNlbnQgUC4gVml2YXgiLAogICAgICBtYWxhcmlhID09ICJwdl9oaXN0b3JpYyIgfiAiSGlzdG9yaWNhbCBQLiBWaXZheCIKICAgICksCiAgICBhY3Jvc3MoCiAgICAgIGMoZmZpX2lzX2NvbW11bml0eTpmZmlfaXNfaGVhbHRoX2ZhY2lsaXR5X25hbWUpLAogICAgICBzdHJfdG9fdGl0bGUKICAgICkKICApICU+JQogIGdyb3VwX2J5KGZmaV9pc19mZXZlcl9tb250aCwgYWdlX2NhdCwgbWFsYXJpYSkgJT4lCiAgc3VtbWFyaXNlKHJlc3VsdF9tYWxhcmlhID0gbWVhbihyZXN1bHRfbWFsYXJpYSkpCgoKc2Vyb180bWFsYXJpYV9mZXZlcl9tb250aCA8LSBmZmlfZmV2ZXJfbW9udGggJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gcmVzdWx0X21hbGFyaWEsCiAgICAgIHkgPSBhZ2VfY2F0LAogICAgICBncm91cCA9IGFnZV9jYXQKICAgICkKICApICsKICBnZW9tX3BhdGgoCiAgICBjb2xvciA9ICIjYmRiZGJkIgogICkgKwogIGdlb21fcG9pbnQoCiAgICBhZXMoY29sb3IgPSBtYWxhcmlhKSwKICAgIHNpemUgPSAzCiAgKSArCiAgZmFjZXRfd3JhcCh2YXJzKGZmaV9pc19mZXZlcl9tb250aCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoCiAgICBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KCksCiAgICAjbGltaXRzID0gYygwLCAwLjUpCiAgKSArCiAgbGFicygKICAgIHkgPSAiQWdlIiwKICAgIHggPSAiU2Vyb3Bvc2l0aXZpdHkiLAogICAgdGl0bGUgPSBzdHJfd3JhcCgiTWFsYXJpYSBzZXJvcG9zaXRpdml0eSBieSB0eXBlIG9mIGV4cG9zdXJlLCBwbGFzbW9kaXVtIGFuZCBwcmVzZW5jZSBvZiBmZXZlciBpbiB0aGUgbGFzdCBtb250aCIsIDEwMCkKICApICsKICBndWlkZXMoCiAgICBjb2xvciA9IGd1aWRlX2xlZ2VuZCgiTWFsYXJpYSIpCiAgKSArCiAgaW5ub3Zhcjo6c2NhbGVfY29sb3JfaW5ub3ZhKCJucHIiKSArCiAgdGhlbWVfYncoKQpgYGAKCmBgYHtyIGV2YWw9RkFMU0V9Cmdnc2F2ZSgKICAiLi8wMl9vdXRwdXQvcGxvdHMvcGxvdDE2X3Nlcm9fNG1hbGFyaWFfZmV2ZXJtb250aC5wbmciLAogIHNlcm9fNG1hbGFyaWFfZmV2ZXJfbW9udGgsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDguNQopCmBgYAoKCiMjIyMgQnkgVHlwZSBvZiBNYWxhcmlhCgpgYGB7cn0KZmZpX2ZldmVyX21vbnRoX3R5cGVvZm1hbGFyaWEgPC0gZmZpX3RvdGFsICU+JQogIGRyb3BfbmEocGZfcmVjZW50OnB2X2hpc3RvcmljLCBhZ2VfY2F0LCBmZmlfaXNfZmV2ZXJfbW9udGgpICU+JQogIHBpdm90X2xvbmdlcigKICAgIGNvbHMgPSBwdl9leHBvc3VyZTpwZl9leHBvc3VyZSwKICAgIG5hbWVzX3RvID0gImV4cG9zdXJlIiwKICAgIHZhbHVlc190byA9ICJyZXN1bHRfZXhwb3N1cmUiCiAgKSAlPiUKICAgIG11dGF0ZSgKICAgICAgZXhwb3N1cmUgPSBjYXNlX3doZW4oCiAgICAgICAgZXhwb3N1cmUgPT0gInB2X2V4cG9zdXJlIiB+ICJQLiBWaXZheCBFeHBvc3VyZSIsCiAgICAgICAgZXhwb3N1cmUgPT0gInBmX2V4cG9zdXJlIiB+ICJQLiBGYWxjaXBhcnVtIEV4cG9zdXJlIgogICAgICApLAogICAgICByZXN1bHRfZXhwb3N1cmUgPSBjYXNlX3doZW4oCiAgICAgICAgcmVzdWx0X2V4cG9zdXJlID09ICJQb3NpdGl2ZSIgfiAxLAogICAgICAgIFRSVUUgfiAwCiAgICAgICksCiAgICAgIGFjcm9zcygKICAgICAgICBjKGZmaV9pc19jb21tdW5pdHk6ZmZpX2lzX2hlYWx0aF9mYWNpbGl0eV9uYW1lKSwKICAgICAgICBzdHJfdG9fdGl0bGUKICAgICAgKQogICAgKSAlPiUKICAgIGdyb3VwX2J5KGZmaV9pc19mZXZlcl9tb250aCwgYWdlX2NhdCwgZXhwb3N1cmUpICU+JQogICAgc3VtbWFyaXNlKHJlc3VsdF9leHBvc3VyZSA9IG1lYW4ocmVzdWx0X2V4cG9zdXJlKSkKCnNlcm9fdHlwZW9mbWFsYXJpYV9mZXZlcl9tb250aCA8LSBmZmlfZmV2ZXJfbW9udGhfdHlwZW9mbWFsYXJpYSAlPiUKICBnZ3Bsb3QoCiAgICBhZXMoCiAgICAgIHggPSByZXN1bHRfZXhwb3N1cmUsCiAgICAgIHkgPSBhZ2VfY2F0LAogICAgICBncm91cCA9IGFnZV9jYXQKICAgICkKICApICsKICBnZW9tX3BhdGgoCiAgICBjb2xvciA9ICIjYmRiZGJkIgogICkgKwogIGdlb21fcG9pbnQoCiAgICBhZXMoY29sb3IgPSBleHBvc3VyZSksCiAgICBzaXplID0gMwogICkgKwogIGZhY2V0X3dyYXAodmFycyhmZmlfaXNfZmV2ZXJfbW9udGgpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLAogICAgIyBsaW1pdHMgPSBjKDAsIDAuNSkKICApICsKICBsYWJzKAogICAgeSA9ICJBZ2UiLAogICAgeCA9ICJTZXJvcG9zaXRpdml0eSIsCiAgICB0aXRsZSA9IHN0cl93cmFwKCJNYWxhcmlhIHNlcm9wb3NpdGl2aXR5IGJ5IHR5cGUgb2YgcGxhc21vZGl1bSBhbmQgcHJlc2VuY2Ugb2YgZmV2ZXIgaW4gdGhlIGxhc3QgbW9udGgiLCAxMDApCiAgKSArCiAgZ3VpZGVzKAogICAgY29sb3IgPSBndWlkZV9sZWdlbmQoIk1hbGFyaWEiKQogICkgKwogIGlubm92YXI6OnNjYWxlX2NvbG9yX2lubm92YSgibnByIikgKwogIHRoZW1lX2J3KCkKYGBgCgpgYGB7ciBldmFsPUZBTFNFfQpnZ3NhdmUoCiAgIi4vMDJfb3V0cHV0L3Bsb3RzL3Bsb3QxNl9zZXJvX3R5cGVvZm1hbGFyaWFfZmV2ZXJtb250aC5wbmciLAogIHNlcm9fdHlwZW9mbWFsYXJpYV9mZXZlcl9tb250aCwKICBkcGkgPSAzMDAsCiAgYmcgPSAid2hpdGUiLAogIHdpZHRoID0gMTIsCiAgaGVpZ2h0ID0gOC41CikKYGBgCgojIyMjIEJ5IFRpbWUgb2YgTWFsYXJpYQoKCmBgYHtyfQpmZmlfZmV2ZXJfbW9udGhfdGltZW9mbWFsYXJpYSA8LSBmZmlfdG90YWwgJT4lCiAgZHJvcF9uYShwZl9yZWNlbnQ6cHZfaGlzdG9yaWMsIGFnZV9jYXQsIGZmaV9pc19mZXZlcl9tb250aCkgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IHJlY2VudF9leHBvc3VyZTpoaXN0b3JpY2FsX2V4cG9zdXJlLAogICAgbmFtZXNfdG8gPSAiZXhwb3N1cmUiLAogICAgdmFsdWVzX3RvID0gInJlc3VsdF9leHBvc3VyZSIKICApICU+JQogIG11dGF0ZSgKICAgIGV4cG9zdXJlID0gY2FzZV93aGVuKAogICAgICBleHBvc3VyZSA9PSAicmVjZW50X2V4cG9zdXJlIiB+ICJSZWNlbnQgRXhwb3N1cmUiLAogICAgICBleHBvc3VyZSA9PSAiaGlzdG9yaWNhbF9leHBvc3VyZSIgfiAiSGlzdG9yaWNhbCBFeHBvc3VyZSIKICAgICksCiAgICByZXN1bHRfZXhwb3N1cmUgPSBjYXNlX3doZW4oCiAgICAgIHJlc3VsdF9leHBvc3VyZSA9PSAiUG9zaXRpdmUiIH4gMSwKICAgICAgVFJVRSB+IDAKICAgICksCiAgICBhY3Jvc3MoCiAgICAgIGMoZmZpX2lzX2NvbW11bml0eTpmZmlfaXNfaGVhbHRoX2ZhY2lsaXR5X25hbWUpLAogICAgICBzdHJfdG9fdGl0bGUKICAgICkKICApICU+JQogIGdyb3VwX2J5KGZmaV9pc19mZXZlcl9tb250aCwgYWdlX2NhdCwgZXhwb3N1cmUpICU+JQogIHN1bW1hcmlzZShyZXN1bHRfZXhwb3N1cmUgPSBtZWFuKHJlc3VsdF9leHBvc3VyZSkpCgpzZXJvX3RpbWVvZm1hbGFyaWFfZmV2ZXJfbW9udGggPC0gZmZpX2ZldmVyX21vbnRoX3R5cGVvZm1hbGFyaWEgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gcmVzdWx0X2V4cG9zdXJlLAogICAgICB5ID0gYWdlX2NhdCwKICAgICAgZ3JvdXAgPSBhZ2VfY2F0CiAgICApCiAgKSArCiAgZ2VvbV9wYXRoKAogICAgY29sb3IgPSAiI2JkYmRiZCIKICApICsKICBnZW9tX3BvaW50KAogICAgYWVzKGNvbG9yID0gZXhwb3N1cmUpLAogICAgc2l6ZSA9IDMKICApICsKICBmYWNldF93cmFwKHZhcnMoZmZpX2lzX2ZldmVyX21vbnRoKSkgKwogIHNjYWxlX3hfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKSwKICAgICMgbGltaXRzID0gYygwLCAwLjUpCiAgKSArCiAgbGFicygKICAgIHkgPSAiQWdlIiwKICAgIHggPSAiU2Vyb3Bvc2l0aXZpdHkiLAogICAgdGl0bGUgPSBzdHJfd3JhcCgiTWFsYXJpYSBzZXJvcG9zaXRpdml0eSBieSB0aW1lIG9mIHBsYXNtb2RpdW0gYW5kIHByZXNlbmNlIG9mIGZldmVyIGluIHRoZSBsYXN0IG1vbnRoIiwgMTAwKQogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KZ2dzYXZlKAogICIuLzAyX291dHB1dC9wbG90cy9wbG90MTZfc2Vyb190aW1lb2ZtYWxhcmlhX2ZldmVybW9udGgucG5nIiwKICBzZXJvX3RpbWVvZm1hbGFyaWFfZmV2ZXJfbW9udGgsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDguNQopCmBgYAoKCiMjIFJlbGF0aW9uIHdpdGggQW50aW1hbGFyaWFsIERydWdzCgojIyMgQnkgNCBNYWxhcmlhCgpgYGB7cn0Kc2Vyb180bWFsYXJpYV9kaXN0cmljdF9hbnRpbWFsZHJ1Z3MgPC0gc2Vyb3Bvc2l0aXZ5X3N1bW1hcmlzZSgKICBmZmlfdG90YWwsCiAgIjRtYWxhcmlhIiwKICBhZ2VfY2F0LAogIGZmaV9pc19hbnRpbWFsX2RydWdfdXNlCikgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gYWdlX2NhdCwKICAgICAgeSA9IHJlc3VsdF9tYWxhcmlhLAogICAgICBjb2xvciA9IG1hbGFyaWEsCiAgICAgIGdyb3VwID0gbWFsYXJpYQogICAgKQogICkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKCkgKwogIGZhY2V0X2dyaWQoCiAgICB2YXJzKGZmaV9pc19hbnRpbWFsX2RydWdfdXNlKSwKICAgIHZhcnMoZmZpX2lzX2Rpc3RyaWN0KSAgICAKICApICsKICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KCksCiAgICBsaW1pdHMgPSBjKDAsIDAuNTApCiAgKSArCiAgbGFicygKICAgIHggPSAiQWdlIiwKICAgIHkgPSAiU2Vyb3Bvc2l0aXZpdHkiCiAgKSArCiAgZ3VpZGVzKAogICAgY29sb3IgPSBndWlkZV9sZWdlbmQoIk1hbGFyaWEiKQogICkgKwogIGlubm92YXI6OnNjYWxlX2NvbG9yX2lubm92YSgibnByIikgKwogIHRoZW1lX2J3KCkKCnNlcm9fNG1hbGFyaWFfZGlzdHJpY3RfYW50aW1hbGRydWdzCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KZ2dzYXZlKAogICIuLzAyX291dHB1dC9wbG90cy9wbG90MTlfc2Vyb180bWFsYXJpYV9kaXN0cmljdF9hbnRpbWFsZHJ1Z3MucG5nIiwKICBzZXJvXzRtYWxhcmlhX2Rpc3RyaWN0X2FudGltYWxkcnVncywKICBkcGkgPSAzMDAsCiAgYmcgPSAid2hpdGUiLAogIHdpZHRoID0gMTIsCiAgaGVpZ2h0ID0gOC41CikKYGBgCgojIyMgQnkgVHlwZSBvZiBNYWxhcmlhCgpgYGB7cn0Kc2Vyb190eXBlb2ZtYWxhcmlhX2Rpc3RyaWN0X2FudGltYWxkcnVncyA8LSBzZXJvcG9zaXRpdnlfc3VtbWFyaXNlKAogIGZmaV90b3RhbCwKICAidHlwZW9mbWFsYXJpYSIsCiAgYWdlX2NhdCwKICBmZmlfaXNfYW50aW1hbF9kcnVnX3VzZQopICU+JQogIGdncGxvdCgKICAgIGFlcygKICAgICAgeCA9IGFnZV9jYXQsCiAgICAgIHkgPSByZXN1bHRfZXhwb3N1cmUsCiAgICAgIGNvbG9yID0gZXhwb3N1cmUsCiAgICAgIGdyb3VwID0gZXhwb3N1cmUKICAgICkKICApICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZSgpICsKICBmYWNldF9ncmlkKAogICAgdmFycyhmZmlfaXNfYW50aW1hbF9kcnVnX3VzZSksCiAgICB2YXJzKGZmaV9pc19kaXN0cmljdCkgICAgCiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLAogICAgbGltaXRzID0gYygwLCAwLjYwKQogICkgKwogIGxhYnMoCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IgogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpCgpzZXJvX3R5cGVvZm1hbGFyaWFfZGlzdHJpY3RfYW50aW1hbGRydWdzCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KZ2dzYXZlKAogICIuLzAyX291dHB1dC9wbG90cy9wbG90MjBfc2Vyb190eXBlb2ZtYWxhcmlhX2Rpc3RyaWN0X2FudGltYWxkcnVncy5wbmciLAogIHNlcm9fdHlwZW9mbWFsYXJpYV9kaXN0cmljdF9hbnRpbWFsZHJ1Z3MsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDguNQopCmBgYAoKIyMjIEJ5IFRpbWUgb2YgTWFsYXJpYQoKYGBge3J9CnNlcm9fdGltZW9mbWFsYXJpYV9kaXN0cmljdF9hbnRpbWFsZHJ1Z3MgPC0gc2Vyb3Bvc2l0aXZ5X3N1bW1hcmlzZSgKICBmZmlfdG90YWwsCiAgInRpbWVvZm1hbGFyaWEiLAogIGFnZV9jYXQsCiAgZmZpX2lzX2FudGltYWxfZHJ1Z191c2UKKSAlPiUKICBnZ3Bsb3QoCiAgICBhZXMoCiAgICAgIHggPSBhZ2VfY2F0LAogICAgICB5ID0gcmVzdWx0X2V4cG9zdXJlLAogICAgICBjb2xvciA9IGV4cG9zdXJlLAogICAgICBncm91cCA9IGV4cG9zdXJlCiAgICApCiAgKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoKSArCiAgZmFjZXRfZ3JpZCgKICAgIHZhcnMoZmZpX2lzX2FudGltYWxfZHJ1Z191c2UpLAogICAgdmFycyhmZmlfaXNfZGlzdHJpY3QpICAgIAogICkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKSwKICAgIGxpbWl0cyA9IGMoMCwgMC41KQogICkgKwogIGxhYnMoCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IgogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpCgpzZXJvX3RpbWVvZm1hbGFyaWFfZGlzdHJpY3RfYW50aW1hbGRydWdzCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KZ2dzYXZlKAogICIuLzAyX291dHB1dC9wbG90cy9wbG90MjFfc2Vyb190aW1lb2ZtYWxhcmlhX2Rpc3RyaWN0X2FudGltYWxkcnVncy5wbmciLAogIHNlcm9fdGltZW9mbWFsYXJpYV9kaXN0cmljdF9hbnRpbWFsZHJ1Z3MsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDguNQopCmBgYAoKCiMjIFJlbGF0aW9uIHdpdGggdGltZSBvZiBzb21lb25lIGhhZCBtYWxhcmlhCgojIyMgQnkgZ2VuZXJhbCBtYWxhcmlhCgpgYGB7cn0KZmZpXzRtYWxhcmlhX21hbF9saWZldGltZSA8LSBmZmlfdG90YWwgJT4lIAogIGRyb3BfbmEob25seV9wdl9leHBvc3VyZTpmcmVlZG9tX21hbGFyaWEsIAogICAgICAgICAgYWdlX2NvZGUsIGZmaV9pc19tYWxfbGlmZXRpbWUpICU+JSAKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gb25seV9wdl9leHBvc3VyZTpmcmVlZG9tX21hbGFyaWEsCiAgICBuYW1lc190byA9ICJtYWxhcmlhIiwKICAgIHZhbHVlc190byA9ICJyZXN1bHRfbWFsYXJpYSIKICApICU+JSAKICBtdXRhdGUoCiAgICByZXN1bHRfbWFsYXJpYSA9IGNhc2Vfd2hlbigKICAgICAgcmVzdWx0X21hbGFyaWEgPT0gIlBvc2l0aXZlIiB+IDEsCiAgICAgIFRSVUUgfiAwCiAgICApLAogICAgbWFsYXJpYSA9IGNhc2Vfd2hlbigKICAgICAgbWFsYXJpYSA9PSAib25seV9wdl9leHBvc3VyZSIgfiAiT25seSBQLiB2aXZheCIsCiAgICAgIG1hbGFyaWEgPT0gIm9ubHlfcGZfZXhwb3N1cmUiIH4gIk9ubHkgUC4gZmFsY2lwYXJ1bSIsCiAgICAgIG1hbGFyaWEgPT0gInB2X3BmX2V4cG9zdXJlIiB+ICJQLiB2aXZheCAmIGZhbGNpcGFydW0gRXhwb3N1cmUiLAogICAgICBtYWxhcmlhID09ICJmcmVlZG9tX21hbGFyaWEiIH4gIkZyZWVkb20gZnJvbSBNYWxhcmlhIgogICAgKSwKICAgIGFjcm9zcygKICAgICAgYyhmZmlfaXNfY29tbXVuaXR5OmZmaV9pc19oZWFsdGhfZmFjaWxpdHlfbmFtZSksCiAgICAgIHN0cl90b190aXRsZQogICAgKQogICkgJT4lCiAgZ3JvdXBfYnkoZmZpX2lzX21hbF9saWZldGltZSwgYWdlX2NvZGUsIG1hbGFyaWEpICU+JQogIHN1bW1hcmlzZShyZXN1bHRfbWFsYXJpYSA9IG1lYW4ocmVzdWx0X21hbGFyaWEpKQoKc2Vyb180bWFsYXJpYV9tYWxfbGlmZXRpbWUgPC0gZmZpXzRtYWxhcmlhX21hbF9saWZldGltZSAlPiUKICBnZ3Bsb3QoCiAgICBhZXMoCiAgICAgIHggPSBhZ2VfY29kZSwKICAgICAgeSA9IHJlc3VsdF9tYWxhcmlhLAogICAgICBmaWxsID0gbWFsYXJpYQogICAgKQogICkgKwogIGdlb21fYXJlYSgpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoCiAgICBsaW1pdHMgPSBjKDEsIDgpLAogICAgYnJlYWtzID0gc2VxKDEsIDgsIDEpLAogICAgbGFiZWxzID0gYygKICAgICAgIlswLTEwKSIsCiAgICAgICJbMTAtMjApIiwKICAgICAgIlsyMC0zMCkiLAogICAgICAiWzMwLTQwKSIsCiAgICAgICJbNDAtNTApIiwKICAgICAgIls1MC02MCkiLAogICAgICAiWzYwLTcwKSIsCiAgICAgICJbNzArKSIKICAgICksCiAgICBleHBhbmQgPSBjKDAsIDApCiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLAogICAgZXhwYW5kID0gYygwLCAwKQogICkgKwogIGZhY2V0X3dyYXAodmFycyhmZmlfaXNfbWFsX2xpZmV0aW1lKSkgKwogIGxhYnMoCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IiwKICAgIHggPSAiQWdlIiwKICAgIHRpdGxlID0gc3RyX3dyYXAoIk1hbGFyaWEgc2Vyb3Bvc2l0aXZpdHkgYnkgdHlwZSBvZiBleHBvc3VyZSwgcGxhc21vZGl1bSBhbmQgaG93IG1hbnkgdGltZXMgdGhleSB0aGluayB0aGV5IGhhdmUgaGFkIG1hbGFyaWEiLCAxMDApCiAgKSArCiAgZ3VpZGVzKAogICAgZmlsbCA9IGd1aWRlX2xlZ2VuZCgiTWFsYXJpYSIpCiAgKSArCiAgaW5ub3Zhcjo6c2NhbGVfZmlsbF9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpICsKICB0aGVtZSgKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICBhbmdsZSA9IDQ1LAogICAgICB2anVzdCA9IDEsCiAgICAgIGhqdXN0ID0gMQogICAgKSwKICAgIHBhbmVsLnNwYWNpbmcgPSB1bml0KDEsICJsaW5lcyIpCiAgKQoKc2Vyb180bWFsYXJpYV9tYWxfbGlmZXRpbWUKYGBgCgpgYGB7ciBldmFsPUZBTFNFfQpnZ3NhdmUoCiAgIi4vMDJfb3V0cHV0L3Bsb3RzL3Bsb3QyMl9zZXJvXzRvZm1hbGFyaWFfbWFsX2xpZmV0aW1lLnBuZyIsCiAgc2Vyb180bWFsYXJpYV9tYWxfbGlmZXRpbWUsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDExLAogIGhlaWdodCA9IDUKKQpgYGAKCiMjIyBCeSBSZWNlbnQgTWFsYXJpYQoKYGBge3J9CmZmaV9yZWNlbnRtYWxhcmlhX21hbF9saWZldGltZSA8LSBmZmlfdG90YWwgJT4lIAogIGRyb3BfbmEob25seV9wdl9yZWNlbnQ6ZnJlZWRvbV9tYWxhcmlhX3JlY2VudCwgCiAgICAgICAgICBhZ2VfY29kZSwgZmZpX2lzX21hbF9saWZldGltZSkgJT4lIAogIHBpdm90X2xvbmdlcigKICAgIGNvbHMgPSBvbmx5X3B2X3JlY2VudDpmcmVlZG9tX21hbGFyaWFfcmVjZW50LAogICAgbmFtZXNfdG8gPSAibWFsYXJpYSIsCiAgICB2YWx1ZXNfdG8gPSAicmVzdWx0X21hbGFyaWEiCiAgKSAlPiUgCiAgbXV0YXRlKAogICAgcmVzdWx0X21hbGFyaWEgPSBjYXNlX3doZW4oCiAgICAgIHJlc3VsdF9tYWxhcmlhID09ICJQb3NpdGl2ZSIgfiAxLAogICAgICBUUlVFIH4gMAogICAgKSwKICAgIG1hbGFyaWEgPSBjYXNlX3doZW4oCiAgICAgIG1hbGFyaWEgPT0gIm9ubHlfcHZfcmVjZW50IiB+ICJPbmx5IFAuIHZpdmF4IFJlY2VudCIsCiAgICAgIG1hbGFyaWEgPT0gIm9ubHlfcGZfcmVjZW50IiB+ICJPbmx5IFAuIGZhbGNpcGFydW0gUmVjZW50IiwKICAgICAgbWFsYXJpYSA9PSAicHZfcGZfcmVjZW50IiB+ICJQLiB2aXZheCAmIGZhbGNpcGFydW0gUmVjZW50IiwKICAgICAgbWFsYXJpYSA9PSAiZnJlZWRvbV9tYWxhcmlhX3JlY2VudCIgfiAiRnJlZWRvbSBmcm9tIE1hbGFyaWEgUmVjZW50IgogICAgKSwKICAgIGFjcm9zcygKICAgICAgYyhmZmlfaXNfY29tbXVuaXR5OmZmaV9pc19oZWFsdGhfZmFjaWxpdHlfbmFtZSksCiAgICAgIHN0cl90b190aXRsZQogICAgKQogICkgJT4lCiAgZ3JvdXBfYnkoZmZpX2lzX21hbF9saWZldGltZSwgYWdlX2NvZGUsIG1hbGFyaWEpICU+JQogIHN1bW1hcmlzZShyZXN1bHRfbWFsYXJpYSA9IG1lYW4ocmVzdWx0X21hbGFyaWEpKQoKc2Vyb19yZWNlbnRtYWxhcmlhX21hbF9saWZldGltZSA8LSBmZmlfcmVjZW50bWFsYXJpYV9tYWxfbGlmZXRpbWUgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gYWdlX2NvZGUsCiAgICAgIHkgPSByZXN1bHRfbWFsYXJpYSwKICAgICAgZmlsbCA9IG1hbGFyaWEKICAgICkKICApICsKICBnZW9tX2FyZWEoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKAogICAgbGltaXRzID0gYygxLCA4KSwKICAgIGJyZWFrcyA9IHNlcSgxLCA4LCAxKSwKICAgIGxhYmVscyA9IGMoCiAgICAgICJbMC0xMCkiLAogICAgICAiWzEwLTIwKSIsCiAgICAgICJbMjAtMzApIiwKICAgICAgIlszMC00MCkiLAogICAgICAiWzQwLTUwKSIsCiAgICAgICJbNTAtNjApIiwKICAgICAgIls2MC03MCkiLAogICAgICAiWzcwKykiCiAgICApLAogICAgZXhwYW5kID0gYygwLCAwKQogICkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKSwKICAgIGV4cGFuZCA9IGMoMCwgMCkKICApICsKICBmYWNldF93cmFwKHZhcnMoZmZpX2lzX21hbF9saWZldGltZSkpICsKICBsYWJzKAogICAgeSA9ICJTZXJvcG9zaXRpdml0eSIsCiAgICB4ID0gIkFnZSIsCiAgICB0aXRsZSA9IHN0cl93cmFwKCJNYWxhcmlhIHNlcm9wb3NpdGl2aXR5IGJ5IHJlY2VudCBleHBvc3VyZSBhbmQgaG93IG1hbnkgdGltZXMgdGhleSB0aGluayB0aGV5IGhhdmUgaGFkIG1hbGFyaWEiLCAxMDApCiAgKSArCiAgZ3VpZGVzKAogICAgZmlsbCA9IGd1aWRlX2xlZ2VuZCgiTWFsYXJpYSIpCiAgKSArCiAgaW5ub3Zhcjo6c2NhbGVfZmlsbF9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpICsKICB0aGVtZSgKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgICBhbmdsZSA9IDQ1LAogICAgICB2anVzdCA9IDEsCiAgICAgIGhqdXN0ID0gMQogICAgKSwKICAgIHBhbmVsLnNwYWNpbmcgPSB1bml0KDEsICJsaW5lcyIpCiAgKQoKc2Vyb19yZWNlbnRtYWxhcmlhX21hbF9saWZldGltZQpgYGAKCmBgYHtyIGV2YWw9RkFMU0V9Cmdnc2F2ZSgKICAiLi8wMl9vdXRwdXQvcGxvdHMvcGxvdDIzX3Nlcm9fcmVjZW50X21hbGFyaWFfbWFsX2xpZmV0aW1lLnBuZyIsCiAgc2Vyb19yZWNlbnRtYWxhcmlhX21hbF9saWZldGltZSwKICBkcGkgPSAzMDAsCiAgYmcgPSAid2hpdGUiLAogIHdpZHRoID0gMTEsCiAgaGVpZ2h0ID0gNQopCmBgYAoKCiMjIyBCeSBIaXN0b3JpYyBNYWxhcmlhCgpgYGB7cn0KZmZpX2hpc3RvcmljbWFsYXJpYV9tYWxfbGlmZXRpbWUgPC0gZmZpX3RvdGFsICU+JSAKICBkcm9wX25hKG9ubHlfcHZfaGlzdG9yaWM6ZnJlZWRvbV9tYWxhcmlhX2hpc3RvcmljLCAKICAgICAgICAgIGFnZV9jb2RlLCBmZmlfaXNfbWFsX2xpZmV0aW1lKSAlPiUgCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IG9ubHlfcHZfaGlzdG9yaWM6ZnJlZWRvbV9tYWxhcmlhX2hpc3RvcmljLAogICAgbmFtZXNfdG8gPSAibWFsYXJpYSIsCiAgICB2YWx1ZXNfdG8gPSAicmVzdWx0X21hbGFyaWEiCiAgKSAlPiUgCiAgbXV0YXRlKAogICAgcmVzdWx0X21hbGFyaWEgPSBjYXNlX3doZW4oCiAgICAgIHJlc3VsdF9tYWxhcmlhID09ICJQb3NpdGl2ZSIgfiAxLAogICAgICBUUlVFIH4gMAogICAgKSwKICAgIG1hbGFyaWEgPSBjYXNlX3doZW4oCiAgICAgIG1hbGFyaWEgPT0gIm9ubHlfcHZfaGlzdG9yaWMiIH4gIk9ubHkgUC4gdml2YXggSGlzdG9yaWMiLAogICAgICBtYWxhcmlhID09ICJvbmx5X3BmX2hpc3RvcmljIiB+ICJPbmx5IFAuIGZhbGNpcGFydW0gSGlzdG9yaWMiLAogICAgICBtYWxhcmlhID09ICJwdl9wZl9oaXN0b3JpYyIgfiAiUC4gdml2YXggJiBmYWxjaXBhcnVtIEhpc3RvcmljIiwKICAgICAgbWFsYXJpYSA9PSAiZnJlZWRvbV9tYWxhcmlhX2hpc3RvcmljIiB+ICJGcmVlZG9tIGZyb20gTWFsYXJpYSBIaXN0b3JpYyIKICAgICksCiAgICBhY3Jvc3MoCiAgICAgIGMoZmZpX2lzX2NvbW11bml0eTpmZmlfaXNfaGVhbHRoX2ZhY2lsaXR5X25hbWUpLAogICAgICBzdHJfdG9fdGl0bGUKICAgICkKICApICU+JQogIGdyb3VwX2J5KGZmaV9pc19tYWxfbGlmZXRpbWUsIGFnZV9jb2RlLCBtYWxhcmlhKSAlPiUKICBzdW1tYXJpc2UocmVzdWx0X21hbGFyaWEgPSBtZWFuKHJlc3VsdF9tYWxhcmlhKSkKCnNlcm9faGlzdG9yaWNtYWxhcmlhX21hbF9saWZldGltZSA8LSBmZmlfaGlzdG9yaWNtYWxhcmlhX21hbF9saWZldGltZSAlPiUKICBnZ3Bsb3QoCiAgICBhZXMoCiAgICAgIHggPSBhZ2VfY29kZSwKICAgICAgeSA9IHJlc3VsdF9tYWxhcmlhLAogICAgICBmaWxsID0gbWFsYXJpYQogICAgKQogICkgKwogIGdlb21fYXJlYSgpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoCiAgICBsaW1pdHMgPSBjKDEsIDgpLAogICAgYnJlYWtzID0gc2VxKDEsIDgsIDEpLAogICAgbGFiZWxzID0gYygKICAgICAgIlswLTEwKSIsCiAgICAgICJbMTAtMjApIiwKICAgICAgIlsyMC0zMCkiLAogICAgICAiWzMwLTQwKSIsCiAgICAgICJbNDAtNTApIiwKICAgICAgIls1MC02MCkiLAogICAgICAiWzYwLTcwKSIsCiAgICAgICJbNzArKSIKICAgICksCiAgICBleHBhbmQgPSBjKDAsIDApCiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLAogICAgZXhwYW5kID0gYygwLCAwKQogICkgKwogIGZhY2V0X3dyYXAodmFycyhmZmlfaXNfbWFsX2xpZmV0aW1lKSkgKwogIGxhYnMoCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IiwKICAgIHggPSAiQWdlIiwKICAgIHRpdGxlID0gc3RyX3dyYXAoIk1hbGFyaWEgc2Vyb3Bvc2l0aXZpdHkgYnkgaGlzdG9yaWMgZXhwb3N1cmUgYW5kIGhvdyBtYW55IHRpbWVzIHRoZXkgdGhpbmsgdGhleSBoYXZlIGhhZCBtYWxhcmlhIiwgMTAwKQogICkgKwogIGd1aWRlcygKICAgIGZpbGwgPSBndWlkZV9sZWdlbmQoIk1hbGFyaWEiKQogICkgKwogIGlubm92YXI6OnNjYWxlX2ZpbGxfaW5ub3ZhKCJucHIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCgKICAgICAgYW5nbGUgPSA0NSwKICAgICAgdmp1c3QgPSAxLAogICAgICBoanVzdCA9IDEKICAgICksCiAgICBwYW5lbC5zcGFjaW5nID0gdW5pdCgxLCAibGluZXMiKQogICkKCnNlcm9faGlzdG9yaWNtYWxhcmlhX21hbF9saWZldGltZQpgYGAKCmBgYHtyIGV2YWw9RkFMU0V9Cmdnc2F2ZSgKICAiLi8wMl9vdXRwdXQvcGxvdHMvcGxvdDI0X3Nlcm9faGlzdG9yaWNfbWFsYXJpYV9tYWxfbGlmZXRpbWUucG5nIiwKICBzZXJvX2hpc3RvcmljbWFsYXJpYV9tYWxfbGlmZXRpbWUsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDExLAogIGhlaWdodCA9IDUKKQpgYGAKCgojIyBSZWxhdGlvbiB3aGVyZSBzb21lb25lIHVzdWFsbHkgYmF0aGUKCiMjIyBCeSA0IE1hbGFyaWEKCmBgYHtyfQpzZXJvXzRtYWxhcmlhX2Rpc3RyaWN0X3Vzc3VhbHliYXRoZTwtIHNlcm9wb3NpdGl2eV9zdW1tYXJpc2UoCiAgZmZpX3RvdGFsLAogICI0bWFsYXJpYSIsCiAgYWdlX2NhdCwKICBmZmlfaXNfcGxhY2Vfc2hvd2VyCikgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gYWdlX2NhdCwKICAgICAgeSA9IHJlc3VsdF9tYWxhcmlhLAogICAgICBjb2xvciA9IG1hbGFyaWEsCiAgICAgIGdyb3VwID0gbWFsYXJpYQogICAgKQogICkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKCkgKwogIGZhY2V0X2dyaWQoCiAgICB2YXJzKGZmaV9pc19wbGFjZV9zaG93ZXIpLAogICAgdmFycyhmZmlfaXNfZGlzdHJpY3QpICAgIAogICkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKSwKICAgICNsaW1pdHMgPSBjKDAsIDAuNTApCiAgKSArCiAgbGFicygKICAgIHggPSAiQWdlIiwKICAgIHkgPSAiU2Vyb3Bvc2l0aXZpdHkiCiAgKSArCiAgZ3VpZGVzKAogICAgY29sb3IgPSBndWlkZV9sZWdlbmQoIk1hbGFyaWEiKQogICkgKwogIGlubm92YXI6OnNjYWxlX2NvbG9yX2lubm92YSgibnByIikgKwogIHRoZW1lX2J3KCkKCnNlcm9fNG1hbGFyaWFfZGlzdHJpY3RfdXNzdWFseWJhdGhlCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KZ2dzYXZlKAogICIuLzAyX291dHB1dC9wbG90cy9wbG90MjVfc2Vyb180bWFsYXJpYV9kaXN0cmljdF91c3N1YWx5YmF0aGUucG5nIiwKICBzZXJvXzRtYWxhcmlhX2Rpc3RyaWN0X3Vzc3VhbHliYXRoZSwKICBkcGkgPSAzMDAsCiAgYmcgPSAid2hpdGUiLAogIHdpZHRoID0gMTIsCiAgaGVpZ2h0ID0gOC41CikKYGBgCgojIyMgQnkgVHlwZSBvZiBNYWxhcmlhCgpgYGB7cn0Kc2Vyb190eXBlb2ZtYWxhcmlhX2Rpc3RyaWN0X3Vzc3VhbHliYXRoZSA8LSBzZXJvcG9zaXRpdnlfc3VtbWFyaXNlKAogIGZmaV90b3RhbCwKICAidHlwZW9mbWFsYXJpYSIsCiAgYWdlX2NhdCwKICBmZmlfaXNfcGxhY2Vfc2hvd2VyCikgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gYWdlX2NhdCwKICAgICAgeSA9IHJlc3VsdF9leHBvc3VyZSwKICAgICAgY29sb3IgPSBleHBvc3VyZSwKICAgICAgZ3JvdXAgPSBleHBvc3VyZQogICAgKQogICkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKCkgKwogIGZhY2V0X2dyaWQoCiAgICB2YXJzKGZmaV9pc19wbGFjZV9zaG93ZXIpLAogICAgdmFycyhmZmlfaXNfZGlzdHJpY3QpICAgIAogICkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKSwKICAgICNsaW1pdHMgPSBjKDAsIDAuNjApCiAgKSArCiAgbGFicygKICAgIHggPSAiQWdlIiwKICAgIHkgPSAiU2Vyb3Bvc2l0aXZpdHkiCiAgKSArCiAgZ3VpZGVzKAogICAgY29sb3IgPSBndWlkZV9sZWdlbmQoIk1hbGFyaWEiKQogICkgKwogIGlubm92YXI6OnNjYWxlX2NvbG9yX2lubm92YSgibnByIikgKwogIHRoZW1lX2J3KCkKCnNlcm9fdHlwZW9mbWFsYXJpYV9kaXN0cmljdF91c3N1YWx5YmF0aGUKYGBgCgpgYGB7ciBldmFsPUZBTFNFfQpnZ3NhdmUoCiAgIi4vMDJfb3V0cHV0L3Bsb3RzL3Bsb3QyNl9zZXJvX3R5cGVvZm1hbGFyaWFfZGlzdHJpY3RfdXNzdWFseWJhdGhlLnBuZyIsCiAgc2Vyb190eXBlb2ZtYWxhcmlhX2Rpc3RyaWN0X3Vzc3VhbHliYXRoZSwKICBkcGkgPSAzMDAsCiAgYmcgPSAid2hpdGUiLAogIHdpZHRoID0gMTIsCiAgaGVpZ2h0ID0gOC41CikKYGBgCgojIyMgQnkgVGltZSBvZiBNYWxhcmlhCgpgYGB7cn0Kc2Vyb190aW1lb2ZtYWxhcmlhX2Rpc3RyaWN0X3Vzc3VhbHliYXRoZSA8LSBzZXJvcG9zaXRpdnlfc3VtbWFyaXNlKAogIGZmaV90b3RhbCwKICAidGltZW9mbWFsYXJpYSIsCiAgYWdlX2NhdCwKICBmZmlfaXNfcGxhY2Vfc2hvd2VyCikgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gYWdlX2NhdCwKICAgICAgeSA9IHJlc3VsdF9leHBvc3VyZSwKICAgICAgY29sb3IgPSBleHBvc3VyZSwKICAgICAgZ3JvdXAgPSBleHBvc3VyZQogICAgKQogICkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKCkgKwogIGZhY2V0X2dyaWQoCiAgICB2YXJzKGZmaV9pc19wbGFjZV9zaG93ZXIpLAogICAgdmFycyhmZmlfaXNfZGlzdHJpY3QpICAgIAogICkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKSwKICAgICNsaW1pdHMgPSBjKDAsIDAuNSkKICApICsKICBsYWJzKAogICAgeCA9ICJBZ2UiLAogICAgeSA9ICJTZXJvcG9zaXRpdml0eSIKICApICsKICBndWlkZXMoCiAgICBjb2xvciA9IGd1aWRlX2xlZ2VuZCgiTWFsYXJpYSIpCiAgKSArCiAgaW5ub3Zhcjo6c2NhbGVfY29sb3JfaW5ub3ZhKCJucHIiKSArCiAgdGhlbWVfYncoKQoKc2Vyb190aW1lb2ZtYWxhcmlhX2Rpc3RyaWN0X3Vzc3VhbHliYXRoZQpgYGAKCmBgYHtyIGV2YWw9RkFMU0V9Cmdnc2F2ZSgKICAiLi8wMl9vdXRwdXQvcGxvdHMvcGxvdDI3X3Nlcm9fdGltZW9mbWFsYXJpYV9kaXN0cmljdF91c3N1YWx5YmF0aGUucG5nIiwKICBzZXJvX3RpbWVvZm1hbGFyaWFfZGlzdHJpY3RfdXNzdWFseWJhdGhlLAogIGRwaSA9IDMwMCwKICBiZyA9ICJ3aGl0ZSIsCiAgd2lkdGggPSAxMiwKICBoZWlnaHQgPSA4LjUKKQpgYGAKCgojIyBSZWxhdGlvbiB3aXRoIHRob3NlIHdobyBoYXZlIGEgbW9zcXVpdG8gbmV0CgojIyMgQnkgNCBNYWxhcmlhCgpgYGB7cn0Kc2Vyb180bWFsYXJpYV9kaXN0cmljdF9tb3NxdWl0bmV0IDwtIHNlcm9wb3NpdGl2eV9zdW1tYXJpc2UoCiAgZmZpX3RvdGFsLAogICI0bWFsYXJpYSIsCiAgYWdlX2NhdCwKICBmZmlfaXNfbW9zcV9uZXQKKSAlPiUKICBnZ3Bsb3QoCiAgICBhZXMoCiAgICAgIHggPSBhZ2VfY2F0LAogICAgICB5ID0gcmVzdWx0X21hbGFyaWEsCiAgICAgIGNvbG9yID0gbWFsYXJpYSwKICAgICAgZ3JvdXAgPSBtYWxhcmlhCiAgICApCiAgKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoKSArCiAgZmFjZXRfZ3JpZCgKICAgIHZhcnMoZmZpX2lzX21vc3FfbmV0KSwKICAgIHZhcnMoZmZpX2lzX2Rpc3RyaWN0KSAgICAKICApICsKICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KCksCiAgICAjbGltaXRzID0gYygwLCAwLjUwKQogICkgKwogIGxhYnMoCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IgogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpCgpzZXJvXzRtYWxhcmlhX2Rpc3RyaWN0X21vc3F1aXRuZXQKYGBgCgpgYGB7ciBldmFsPUZBTFNFfQpnZ3NhdmUoCiAgIi4vMDJfb3V0cHV0L3Bsb3RzL3Bsb3QyOF9zZXJvXzRtYWxhcmlhX2Rpc3RyaWN0X21vc3F1aXRuZXQucG5nIiwKICBzZXJvXzRtYWxhcmlhX2Rpc3RyaWN0X21vc3F1aXRuZXQsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDguNQopCmBgYAoKIyMjIEJ5IFR5cGUgb2YgTWFsYXJpYQoKYGBge3J9CnNlcm9fdHlwZW9mbWFsYXJpYV9kaXN0cmljdF9tb3NxdWl0bmV0IDwtIHNlcm9wb3NpdGl2eV9zdW1tYXJpc2UoCiAgZmZpX3RvdGFsLAogICJ0eXBlb2ZtYWxhcmlhIiwKICBhZ2VfY2F0LAogIGZmaV9pc19tb3NxX25ldAopICU+JQogIGdncGxvdCgKICAgIGFlcygKICAgICAgeCA9IGFnZV9jYXQsCiAgICAgIHkgPSByZXN1bHRfZXhwb3N1cmUsCiAgICAgIGNvbG9yID0gZXhwb3N1cmUsCiAgICAgIGdyb3VwID0gZXhwb3N1cmUKICAgICkKICApICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZSgpICsKICBmYWNldF9ncmlkKAogICAgdmFycyhmZmlfaXNfbW9zcV9uZXQpLAogICAgdmFycyhmZmlfaXNfZGlzdHJpY3QpICAgIAogICkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKSwKICAgICNsaW1pdHMgPSBjKDAsIDAuNjApCiAgKSArCiAgbGFicygKICAgIHggPSAiQWdlIiwKICAgIHkgPSAiU2Vyb3Bvc2l0aXZpdHkiCiAgKSArCiAgZ3VpZGVzKAogICAgY29sb3IgPSBndWlkZV9sZWdlbmQoIk1hbGFyaWEiKQogICkgKwogIGlubm92YXI6OnNjYWxlX2NvbG9yX2lubm92YSgibnByIikgKwogIHRoZW1lX2J3KCkKCnNlcm9fdHlwZW9mbWFsYXJpYV9kaXN0cmljdF9tb3NxdWl0bmV0CmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KZ2dzYXZlKAogICIuLzAyX291dHB1dC9wbG90cy9wbG90Mjlfc2Vyb190eXBlb2ZtYWxhcmlhX2Rpc3RyaWN0X21vc3F1aXRuZXQucG5nIiwKICBzZXJvX3R5cGVvZm1hbGFyaWFfZGlzdHJpY3RfbW9zcXVpdG5ldCwKICBkcGkgPSAzMDAsCiAgYmcgPSAid2hpdGUiLAogIHdpZHRoID0gMTIsCiAgaGVpZ2h0ID0gOC41CikKYGBgCgojIyMgQnkgVGltZSBvZiBNYWxhcmlhCgpgYGB7cn0Kc2Vyb190aW1lb2ZtYWxhcmlhX2Rpc3RyaWN0X21vc3F1aXRuZXQgPC0gc2Vyb3Bvc2l0aXZ5X3N1bW1hcmlzZSgKICBmZmlfdG90YWwsCiAgInRpbWVvZm1hbGFyaWEiLAogIGFnZV9jYXQsCiAgZmZpX2lzX21vc3FfbmV0CikgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gYWdlX2NhdCwKICAgICAgeSA9IHJlc3VsdF9leHBvc3VyZSwKICAgICAgY29sb3IgPSBleHBvc3VyZSwKICAgICAgZ3JvdXAgPSBleHBvc3VyZQogICAgKQogICkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKCkgKwogIGZhY2V0X2dyaWQoCiAgICB2YXJzKGZmaV9pc19tb3NxX25ldCksCiAgICB2YXJzKGZmaV9pc19kaXN0cmljdCkgICAgCiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLAogICAgI2xpbWl0cyA9IGMoMCwgMC41KQogICkgKwogIGxhYnMoCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IgogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpCgpzZXJvX3RpbWVvZm1hbGFyaWFfZGlzdHJpY3RfbW9zcXVpdG5ldApgYGAKCmBgYHtyIGV2YWw9RkFMU0V9Cmdnc2F2ZSgKICAiLi8wMl9vdXRwdXQvcGxvdHMvcGxvdDMwX3Nlcm9fdGltZW9mbWFsYXJpYV9kaXN0cmljdF9tb3NxdWl0bmV0LnBuZyIsCiAgc2Vyb190aW1lb2ZtYWxhcmlhX2Rpc3RyaWN0X21vc3F1aXRuZXQsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDguNQopCmBgYAoKIyMgUmVsYXRpb24gd2l0aCB0aG9zZSB3aG8gaGF2ZSBhIHRyaXAgaW4gdGhlIGxhc3QgbW9udGgKCiMjIyBCeSA0IE1hbGFyaWEKCmBgYHtyfQpzZXJvXzRtYWxhcmlhX2Rpc3RyaWN0X3RyaXBtb250aCA8LSBzZXJvcG9zaXRpdnlfc3VtbWFyaXNlKAogIGZmaV90b3RhbCwKICAiNG1hbGFyaWEiLAogIGFnZV9jYXQsCiAgZmZpX2lzX3RyaXBfbW9udGgKKSAlPiUKICBnZ3Bsb3QoCiAgICBhZXMoCiAgICAgIHggPSBhZ2VfY2F0LAogICAgICB5ID0gcmVzdWx0X21hbGFyaWEsCiAgICAgIGNvbG9yID0gbWFsYXJpYSwKICAgICAgZ3JvdXAgPSBtYWxhcmlhCiAgICApCiAgKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoKSArCiAgZmFjZXRfZ3JpZCgKICAgIHZhcnMoZmZpX2lzX3RyaXBfbW9udGgpLAogICAgdmFycyhmZmlfaXNfZGlzdHJpY3QpICAgIAogICkgKwogIHNjYWxlX3lfY29udGludW91cygKICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoKSwKICAgICNsaW1pdHMgPSBjKDAsIDAuNTApCiAgKSArCiAgbGFicygKICAgIHggPSAiQWdlIiwKICAgIHkgPSAiU2Vyb3Bvc2l0aXZpdHkiCiAgKSArCiAgZ3VpZGVzKAogICAgY29sb3IgPSBndWlkZV9sZWdlbmQoIk1hbGFyaWEiKQogICkgKwogIGlubm92YXI6OnNjYWxlX2NvbG9yX2lubm92YSgibnByIikgKwogIHRoZW1lX2J3KCkKCnNlcm9fNG1hbGFyaWFfZGlzdHJpY3RfdHJpcG1vbnRoCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KZ2dzYXZlKAogICIuLzAyX291dHB1dC9wbG90cy9wbG90MzFfc2Vyb180bWFsYXJpYV9kaXN0cmljdF90cmlwbW9udGgucG5nIiwKICBzZXJvXzRtYWxhcmlhX2Rpc3RyaWN0X3RyaXBtb250aCwKICBkcGkgPSAzMDAsCiAgYmcgPSAid2hpdGUiLAogIHdpZHRoID0gMTIsCiAgaGVpZ2h0ID0gOC41CikKYGBgCgojIyMgQnkgVHlwZSBvZiBNYWxhcmlhCgpgYGB7cn0Kc2Vyb190eXBlb2ZtYWxhcmlhX2Rpc3RyaWN0X3RyaXBtb250aCA8LSBzZXJvcG9zaXRpdnlfc3VtbWFyaXNlKAogIGZmaV90b3RhbCwKICAidHlwZW9mbWFsYXJpYSIsCiAgYWdlX2NhdCwKICBmZmlfaXNfdHJpcF9tb250aAopICU+JQogIGdncGxvdCgKICAgIGFlcygKICAgICAgeCA9IGFnZV9jYXQsCiAgICAgIHkgPSByZXN1bHRfZXhwb3N1cmUsCiAgICAgIGNvbG9yID0gZXhwb3N1cmUsCiAgICAgIGdyb3VwID0gZXhwb3N1cmUKICAgICkKICApICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fbGluZSgpICsKICBmYWNldF9ncmlkKAogICAgdmFycyhmZmlfaXNfdHJpcF9tb250aCksCiAgICB2YXJzKGZmaV9pc19kaXN0cmljdCkgICAgCiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLAogICAgI2xpbWl0cyA9IGMoMCwgMC42MCkKICApICsKICBsYWJzKAogICAgeCA9ICJBZ2UiLAogICAgeSA9ICJTZXJvcG9zaXRpdml0eSIKICApICsKICBndWlkZXMoCiAgICBjb2xvciA9IGd1aWRlX2xlZ2VuZCgiTWFsYXJpYSIpCiAgKSArCiAgaW5ub3Zhcjo6c2NhbGVfY29sb3JfaW5ub3ZhKCJucHIiKSArCiAgdGhlbWVfYncoKQoKc2Vyb190eXBlb2ZtYWxhcmlhX2Rpc3RyaWN0X3RyaXBtb250aApgYGAKCmBgYHtyIGV2YWw9RkFMU0V9Cmdnc2F2ZSgKICAiLi8wMl9vdXRwdXQvcGxvdHMvcGxvdDMyX3Nlcm9fdHlwZW9mbWFsYXJpYV9kaXN0cmljdF90cmlwbW9udGgucG5nIiwKICBzZXJvX3R5cGVvZm1hbGFyaWFfZGlzdHJpY3RfdHJpcG1vbnRoLAogIGRwaSA9IDMwMCwKICBiZyA9ICJ3aGl0ZSIsCiAgd2lkdGggPSAxMiwKICBoZWlnaHQgPSA4LjUKKQpgYGAKCiMjIyBCeSBUaW1lIG9mIE1hbGFyaWEKCmBgYHtyfQpzZXJvX3RpbWVvZm1hbGFyaWFfZGlzdHJpY3RfdHJpcG1vbnRoIDwtIHNlcm9wb3NpdGl2eV9zdW1tYXJpc2UoCiAgZmZpX3RvdGFsLAogICJ0aW1lb2ZtYWxhcmlhIiwKICBhZ2VfY2F0LAogIGZmaV9pc190cmlwX21vbnRoCikgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gYWdlX2NhdCwKICAgICAgeSA9IHJlc3VsdF9leHBvc3VyZSwKICAgICAgY29sb3IgPSBleHBvc3VyZSwKICAgICAgZ3JvdXAgPSBleHBvc3VyZQogICAgKQogICkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKCkgKwogIGZhY2V0X2dyaWQoCiAgICB2YXJzKGZmaV9pc190cmlwX21vbnRoKSwKICAgIHZhcnMoZmZpX2lzX2Rpc3RyaWN0KSAgICAKICApICsKICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KCksCiAgICAjbGltaXRzID0gYygwLCAwLjUpCiAgKSArCiAgbGFicygKICAgIHggPSAiQWdlIiwKICAgIHkgPSAiU2Vyb3Bvc2l0aXZpdHkiCiAgKSArCiAgZ3VpZGVzKAogICAgY29sb3IgPSBndWlkZV9sZWdlbmQoIk1hbGFyaWEiKQogICkgKwogIGlubm92YXI6OnNjYWxlX2NvbG9yX2lubm92YSgibnByIikgKwogIHRoZW1lX2J3KCkKCnNlcm9fdGltZW9mbWFsYXJpYV9kaXN0cmljdF90cmlwbW9udGgKYGBgCgpgYGB7ciBldmFsPUZBTFNFfQpnZ3NhdmUoCiAgIi4vMDJfb3V0cHV0L3Bsb3RzL3Bsb3QzM19zZXJvX3RpbWVvZm1hbGFyaWFfZGlzdHJpY3RfdHJpcG1vbnRoLnBuZyIsCiAgc2Vyb190aW1lb2ZtYWxhcmlhX2Rpc3RyaWN0X3RyaXBtb250aCwKICBkcGkgPSAzMDAsCiAgYmcgPSAid2hpdGUiLAogIHdpZHRoID0gMTIsCiAgaGVpZ2h0ID0gOC41CikKYGBgCgojIERlc2NyaXB0aXZlIDAxX2RhdGEKCmBgYHtyIGV2YWw9RkFMU0V9CnBsb3RfNF8yIDwtIGZmaV90b3RhbCAlPiUKICBmaWx0ZXIoZmZpX2lzX21hbGFyaWEgJWluJSBjKCJObyIsICJZZXMiKSkgJT4lCiAgZHJvcF9uYShhZ2VfY2F0LCBwdl9oaXN0b3JpYykgJT4lCiAgbXV0YXRlKAogICAgbWFsYXJpYV9nZW5kZXIgPSBwYXN0ZShnZW5kZXIsIGZmaV9pc19tYWxhcmlhKQogICkgJT4lCiAgY291bnQocHZfaGlzdG9yaWMsIGFnZV9jYXQsIG1hbGFyaWFfZ2VuZGVyKSAlPiUKICBtdXRhdGUoUGVyY2VudGFnZSA9IG4gLyBzdW0obikpICU+JQogIG11dGF0ZSgKICAgIFBlcmNlbnRhZ2UgPSBjYXNlX3doZW4oCiAgICAgIHN0cl9kZXRlY3QobWFsYXJpYV9nZW5kZXIsICJGZW1hbGUiKSB+IFBlcmNlbnRhZ2UgKiAtMSwKICAgICAgVFJVRSB+IFBlcmNlbnRhZ2UKICAgICkKICApICU+JQogIGdncGxvdChhZXMoCiAgICB5ID0gYWdlX2NhdCwKICAgIHggPSBQZXJjZW50YWdlLAogICAgZmlsbCA9IG1hbGFyaWFfZ2VuZGVyCiAgKSkgKwogIGdlb21fY29sKAogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayhyZXZlcnNlID0gVFJVRSksCiAgICBjb2xvciA9ICJibGFjayIKICApICsKICBsYWJzKAogICAgeCA9ICJBZ2UgR3JvdXAiLAogICAgeSA9IE5VTEwsCiAgICB0aXRsZSA9ICJQb3B1bGF0aW9uIHN0cnVjdHVyZSBieSBhZ2UgZ3JvdXBzLCBnZW5kZXIgYW5kIG1hbGFyaWEgdHJhbnNtaXNzaW9uIgogICkgKwogIGZhY2V0X3dyYXAodmFycyhwdl9oaXN0b3JpYykpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKAogICAgbGltaXRzID0gYygtMC4yNSwgMC4yNSksCiAgICBicmVha3MgPSBzZXEoLTAuMjUsIDAuMjUsIDAuMDUpLAogICAgbGFiZWxzID0gYyhwYXN0ZTAoc2VxKDI1LCAwLCAtNSksICIlIiksIHBhc3RlMChzZXEoNSwgMjUsIDUpLCAiJSIpKQogICkgKwogICMgaW5ub3Zhcjo6c2NhbGVfZmlsbF9pbm5vdmEoIm5wciIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKAogICAgdHlwZSA9IGlubm92YXI6Omlubm92YV9wYWwoIm5wciIpKDQpLAogICAgbGltaXRzID0gYygiTWFsZSBZZXMiLCAiTWFsZSBObyIsICJGZW1hbGUgTm8iLCAiRmVtYWxlIFllcyIpCiAgKSArCiAgZ3VpZGVzKAogICAgZmlsbCA9IGd1aWRlX2xlZ2VuZCgiSGF2ZSB5b3UgZXZlciBcbmhhZCBtYWxhcmlhPyIpCiAgKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgc2l6ZSA9IDEpICsKICB0aGVtZV9idyhiYXNlX3NpemUgPSAxMikgKwogIHRoZW1lKAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IDE0LAogICAgICBoanVzdCA9IDAuNSwKICAgICAgZmFjZSA9ICJib2xkIgogICAgKSwKICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSAxMiwKICAgICAgZmFjZSA9ICJib2xkIgogICAgKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IDEyLAogICAgICBmYWNlID0gImJvbGQiCiAgICApLAogICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oNSwgMTUsIDUsIDE1KQogICkKYGBgCgojIERlc2NyaXB0aXZlIDAxX2RhdGEKCmBgYHtyIGV2YWw9RkFMU0V9CnBsb3RfNF8yIDwtIGZmaV90b3RhbCAlPiUKICBmaWx0ZXIoZmZpX2lzX21hbGFyaWEgJWluJSBjKCJObyIsICJZZXMiKSkgJT4lCiAgZHJvcF9uYShhZ2VfY2F0LCBwdl9oaXN0b3JpYykgJT4lCiAgbXV0YXRlKAogICAgbWFsYXJpYV9nZW5kZXIgPSBwYXN0ZShnZW5kZXIsIGZmaV9pc19tYWxhcmlhKQogICkgJT4lCiAgY291bnQocHZfaGlzdG9yaWMsIGFnZV9jYXQsIG1hbGFyaWFfZ2VuZGVyKSAlPiUKICBtdXRhdGUoUGVyY2VudGFnZSA9IG4gLyBzdW0obikpICU+JQogIG11dGF0ZSgKICAgIFBlcmNlbnRhZ2UgPSBjYXNlX3doZW4oCiAgICAgIHN0cl9kZXRlY3QobWFsYXJpYV9nZW5kZXIsICJGZW1hbGUiKSB+IFBlcmNlbnRhZ2UgKiAtMSwKICAgICAgVFJVRSB+IFBlcmNlbnRhZ2UKICAgICkKICApICU+JQogIGdncGxvdChhZXMoCiAgICB5ID0gYWdlX2NhdCwKICAgIHggPSBQZXJjZW50YWdlLAogICAgZmlsbCA9IG1hbGFyaWFfZ2VuZGVyCiAgKSkgKwogIGdlb21fY29sKAogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayhyZXZlcnNlID0gVFJVRSksCiAgICBjb2xvciA9ICJibGFjayIKICApICsKICBsYWJzKAogICAgeCA9ICJBZ2UgR3JvdXAiLAogICAgeSA9IE5VTEwsCiAgICB0aXRsZSA9ICJQb3B1bGF0aW9uIHN0cnVjdHVyZSBieSBhZ2UgZ3JvdXBzLCBnZW5kZXIgYW5kIG1hbGFyaWEgdHJhbnNtaXNzaW9uIgogICkgKwogIGZhY2V0X3dyYXAodmFycyhwdl9oaXN0b3JpYykpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKAogICAgbGltaXRzID0gYygtMC4yNSwgMC4yNSksCiAgICBicmVha3MgPSBzZXEoLTAuMjUsIDAuMjUsIDAuMDUpLAogICAgbGFiZWxzID0gYyhwYXN0ZTAoc2VxKDI1LCAwLCAtNSksICIlIiksIHBhc3RlMChzZXEoNSwgMjUsIDUpLCAiJSIpKQogICkgKwogICMgaW5ub3Zhcjo6c2NhbGVfZmlsbF9pbm5vdmEoIm5wciIpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKAogICAgdHlwZSA9IGlubm92YXI6Omlubm92YV9wYWwoIm5wciIpKDQpLAogICAgbGltaXRzID0gYygiTWFsZSBZZXMiLCAiTWFsZSBObyIsICJGZW1hbGUgTm8iLCAiRmVtYWxlIFllcyIpCiAgKSArCiAgZ3VpZGVzKAogICAgZmlsbCA9IGd1aWRlX2xlZ2VuZCgiSGF2ZSB5b3UgZXZlciBcbmhhZCBtYWxhcmlhPyIpCiAgKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgc2l6ZSA9IDEpICsKICB0aGVtZV9idyhiYXNlX3NpemUgPSAxMikgKwogIHRoZW1lKAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IDE0LAogICAgICBoanVzdCA9IDAuNSwKICAgICAgZmFjZSA9ICJib2xkIgogICAgKSwKICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoCiAgICAgIHNpemUgPSAxMiwKICAgICAgZmFjZSA9ICJib2xkIgogICAgKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dCgKICAgICAgc2l6ZSA9IDEyLAogICAgICBmYWNlID0gImJvbGQiCiAgICApLAogICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oNSwgMTUsIDUsIDE1KQogICkKYGBgCgojIyBTYW5rZXlfc2Vyb3Bvc2l0aXZlCgoKYGBge3J9CmxpYnJhcnkoZ2dzYW5rZXkpCgpmZmlfZm9ybWF0X3NhbmtleSA8LSBmZmlfdG90YWwgJT4lCiAgbXV0YXRlKAogICAgZmZpX2lzX2FjY2Vzc19tYWxhcmlhX3luX2hmID0gZmFjdG9yKAogICAgICBmZmlfaXNfYWNjZXNzX21hbGFyaWFfeW5faGYsCiAgICAgIGxhYmVsID0gYygiTm8iLCAiWWVzIikKICAgICksCiAgICBmZmlfaXNfbWFsX2xpZmV0aW1lID0gYXMuY2hhcmFjdGVyKGZmaV9pc19tYWxfbGlmZXRpbWUpLAogICAgZmZpX2lzX21hbF9saWZldGltZSA9IHJlcGxhY2VfbmEoZmZpX2lzX21hbF9saWZldGltZSwgIjAgdGltZXMiKSwKICAgIGZmaV9pc19tYWxfbGlmZXRpbWUgPSBmYWN0b3IoCiAgICAgIGZmaV9pc19tYWxfbGlmZXRpbWUsCiAgICAgIGxhYmVscyA9IGMoCiAgICAgICAgIjAgdGltZXMiLAogICAgICAgICIxIHRvIDMgdGltZXMiLAogICAgICAgICIzIHRvIDcgdGltZXMiLAogICAgICAgICJNb3JlIHRoYW4gNyB0aW1lcyIKICAgICAgKQogICAgKQogICkKCnNhbmtleV9zZXJvcG9zaXRpdmVfYW5zdzEgPC0gZmZpX2Zvcm1hdF9zYW5rZXkgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IGMocmVjZW50X2V4cG9zdXJlLCBmZmlfaXNfbWFsX2xpZmV0aW1lLCBmZmlfaXNfYWNjZXNzX21hbGFyaWFfeW5faGYpLAogICAgbmFtZXNfdG8gPSAibWFsYXJpYV9iZWhhdmlvcjEiLAogICAgdmFsdWVzX3RvID0gIm1hbGFyaWFfYW5zdzEiCiAgKSAlPiUKICBjb3VudChtYWxhcmlhX2JlaGF2aW9yMSwgbWFsYXJpYV9hbnN3MSkgJT4lCiAgZ3JvdXBfYnkobWFsYXJpYV9iZWhhdmlvcjEpICU+JQogIG11dGF0ZSgKICAgIHBlcmNlbnRhZ2UgPSBzY2FsZXM6OnBlcmNlbnQoCiAgICAgIG4gLyBzdW0obiksCiAgICAgIGFjY3VyYWN5ID0gMC4xCiAgICApCiAgKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKAogICAgbWFsYXJpYV9iZWhhdmlvcjEgPSBmY3RfcmVsZXZlbCgKICAgICAgbWFsYXJpYV9iZWhhdmlvcjEsCiAgICAgICJmZmlfaXNfbWFsX2xpZmV0aW1lIiwKICAgICAgImZmaV9pc19hY2Nlc3NfbWFsYXJpYV95bl9oZiIsCiAgICAgICJyZWNlbnRfZXhwb3N1cmUiCiAgICApLAogICAgbWFsYXJpYV9wZXJjZW50MSA9IHBhc3RlMCgKICAgICAgbWFsYXJpYV9hbnN3MSwKICAgICAgcGFzdGUwKCJcbigiLCBwZXJjZW50YWdlLCAiKSIpCiAgICApLAogICAgbWFsYXJpYV9wZXJjZW50MSA9IGFzX2ZhY3RvcihtYWxhcmlhX3BlcmNlbnQxKQogICkgJT4lCiAgc2VsZWN0KG1hbGFyaWFfYmVoYXZpb3IxLCBtYWxhcmlhX2Fuc3cxLCBtYWxhcmlhX3BlcmNlbnQxKQoKCnNhbmtleV9zZXJvcG9zaXRpdmUgPC0gZmZpX2Zvcm1hdF9zYW5rZXkgJT4lCiAgZHJvcF9uYShmZmlfaXNfbWFsX2xpZmV0aW1lLCAKICBmZmlfaXNfYWNjZXNzX21hbGFyaWFfeW5faGYsCiAgcmVjZW50X2V4cG9zdXJlCiAgKSAlPiUKICBtYWtlX2xvbmcoCiAgICBmZmlfaXNfbWFsX2xpZmV0aW1lLAogICAgZmZpX2lzX2FjY2Vzc19tYWxhcmlhX3luX2hmLCAKICAgIHJlY2VudF9leHBvc3VyZQogICkgJT4lCiAgbGVmdF9qb2luKAogICAgc2Fua2V5X3Nlcm9wb3NpdGl2ZV9hbnN3MSwKICAgICAgYnkgPSBjKAogICAgICAgICJ4IiA9ICJtYWxhcmlhX2JlaGF2aW9yMSIsCiAgICAgICAgIm5vZGUiID0gIm1hbGFyaWFfYW5zdzEiCiAgICAgICkKICApICU+JQogIG11dGF0ZSgKICAgIG5vZGUgPSBtYWxhcmlhX3BlcmNlbnQxLAogICAgbm9kZSA9IGZjdF9yZXYobm9kZSkKICApICU+JQogIHNlbGVjdCgtbWFsYXJpYV9wZXJjZW50MSkgJT4lCiAgbGVmdF9qb2luKAogICAgc2Fua2V5X3Nlcm9wb3NpdGl2ZV9hbnN3MSwKICAgIGJ5ID0gYygKICAgICAgIm5leHRfeCIgPSAibWFsYXJpYV9iZWhhdmlvcjEiLAogICAgICAibmV4dF9ub2RlIiA9ICJtYWxhcmlhX2Fuc3cxIgogICAgKQogICkgJT4lCiAgbXV0YXRlKG5leHRfbm9kZSA9IG1hbGFyaWFfcGVyY2VudDEpICU+JQogIHNlbGVjdCgtbWFsYXJpYV9wZXJjZW50MSkgJT4lCiAgZ2dwbG90KGFlcygKICAgIHggPSB4LAogICAgbmV4dF94ID0gbmV4dF94LAogICAgbm9kZSA9IG5vZGUsCiAgICBuZXh0X25vZGUgPSBuZXh0X25vZGUsCiAgICBmaWxsID0gZmFjdG9yKG5vZGUpLAogICAgbGFiZWwgPSBub2RlCiAgKSkgKwogIGdlb21fc2Fua2V5KAogICAgZmxvdy5hbHBoYSA9IC44LAogICAgbm9kZS5jb2xvciA9ICJncmF5MzAiCiAgKSArCiAgZ2VvbV9zYW5rZXlfbGFiZWwoc2l6ZSA9IDQsIGNvbG9yID0gIndoaXRlIiwgZmlsbCA9ICJncmF5MzAiKSArCiAgc2NhbGVfeF9kaXNjcmV0ZSgKICAgIGxhYmVscyA9IHN0cl93cmFwKAogICAgICBjKAogICAgICAgICJIb3cgbWFueSB0aW1lcyBkbyB5b3UgdGhpbmsgeW91IGhhdmUgaGFkIG1hbGFyaWEgaW4geW91ciBsaWZlPyIsCiAgICAgICAgIklmIHlvdSBoYWQgbWFsYXJpYSwgd291bGQgeW91IGdvIHRvIHRoZSBoZWFsdGggZmFjaWxpdHk/IiwKICAgICAgICAiUmVjZW50IGV4cG9zdXJlIHRvIGFueSB0eXBlIG9mIHBsYXNtb2RpdW0iCiAgICAgICksCiAgICAgIDMwCiAgICApCiAgKSArCiAgdGhlbWVfc2Fua2V5KGJhc2Vfc2l6ZSA9IDE4KSArCiAgaW5ub3Zhcjo6c2NhbGVfZmlsbF9pbm5vdmEoIm5wciIpICsKICBsYWJzKAogICAgeCA9IE5VTEwsCiAgICB0aXRsZSA9ICJCZWhhdmlvdXIgYXNzb2NpYXRlZCB3aXRoIHJlY2VudCBtYWxhcmlhIGV4cG9zdXJlIgogICkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IC41KSwKICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDUsIDUsIDUsIDUpCiAgKQoKYGBgCgpgYGB7ciBldmFsPUZBTFNFfQpnZ3NhdmUoIi4vMDJfb3V0cHV0L3Bsb3RzL3Bsb3QzNF9zYW5rZXlfc2Vyb3Bvc2l0aXZlLnBuZyIsCiAgICAgICBzYW5rZXlfc2Vyb3Bvc2l0aXZlLAogICAgICAgaGVpZ2h0ID0gNywKICAgICAgIHdpZHRoID0gMTQsCiAgICAgICBkcGkgPSAzMDApCmBgYAoKIyMgUmVsYXRpb24gZ2VuZGVyIGFuZCBvY3VwYXRpb24KCiMjIyBCeSA0IE1hbGFyaWEKCmBgYHtyfQpzZXJvXzRtYWxhcmlhX2Rpc3RyaWN0X2dlbmRlcl9lY29ub21pYyA8LSBzZXJvcG9zaXRpdnlfc3VtbWFyaXNlKAogIGZmaV90b3RhbCwKICAiNG1hbGFyaWEiLAogIGVjb25vbWljX2FjdGl2aXRpZXMsCiAgZ2VuZGVyCikgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gZWNvbm9taWNfYWN0aXZpdGllcywKICAgICAgeSA9IHJlc3VsdF9tYWxhcmlhLAogICAgICBjb2xvciA9IG1hbGFyaWEsCiAgICAgIGdyb3VwID0gbWFsYXJpYQogICAgKQogICkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKCkgKwogIGZhY2V0X2dyaWQoCiAgICB2YXJzKGdlbmRlciksCiAgICB2YXJzKGZmaV9pc19kaXN0cmljdCkgICAgCiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLAogICAgbGltaXRzID0gYygwLCAwLjQwKQogICkgKwogIGxhYnMoCiAgICB4ID0gIkVjb25vbWljIEFjdGl2aXRpZXMiLAogICAgeSA9ICJTZXJvcG9zaXRpdml0eSIKICApICsKICBndWlkZXMoCiAgICBjb2xvciA9IGd1aWRlX2xlZ2VuZCgiTWFsYXJpYSIpCiAgKSArCiAgaW5ub3Zhcjo6c2NhbGVfY29sb3JfaW5ub3ZhKCJucHIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCgKICAgICAgYW5nbGUgPSA0NSwKICAgICAgdmp1c3QgPSAxLAogICAgICBoanVzdCA9IDEKICAgICkKICApCgpzZXJvXzRtYWxhcmlhX2Rpc3RyaWN0X2dlbmRlcl9lY29ub21pYwpgYGAKCmBgYHtyIGV2YWw9RkFMU0V9Cmdnc2F2ZSgKICAiLi8wMl9vdXRwdXQvcGxvdHMvcGxvdDM1X3Nlcm9fNG1hbGFyaWFfZGlzdHJpY3RfZ2VuZGVyX2Vjb25vbWljLnBuZyIsCiAgc2Vyb180bWFsYXJpYV9kaXN0cmljdF9nZW5kZXJfZWNvbm9taWMsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDExLAogIGhlaWdodCA9IDcuNSwKICBzY2FsZSA9IDAuOQopCmBgYAoKIyMjIEJ5IFR5cGUgb2YgTWFsYXJpYQoKYGBge3J9CnNlcm9fdHlwZW9mbWFsYXJpYV9kaXN0cmljdF9nZW5kZXIgPC0gc2Vyb3Bvc2l0aXZ5X3N1bW1hcmlzZSgKICBmZmlfdG90YWwsCiAgInR5cGVvZm1hbGFyaWEiLAogIGFnZV9jYXQsCiAgZ2VuZGVyCikgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gYWdlX2NhdCwKICAgICAgeSA9IHJlc3VsdF9leHBvc3VyZSwKICAgICAgY29sb3IgPSBleHBvc3VyZSwKICAgICAgZ3JvdXAgPSBleHBvc3VyZQogICAgKQogICkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKCkgKwogIGZhY2V0X2dyaWQoCiAgICB2YXJzKGdlbmRlciksCiAgICB2YXJzKGZmaV9pc19kaXN0cmljdCkgICAgCiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLAogICAgbGltaXRzID0gYygwLCAwLjQ1KQogICkgKwogIGxhYnMoCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IgogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpCgpzZXJvX3R5cGVvZm1hbGFyaWFfZGlzdHJpY3RfZ2VuZGVyCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KZ2dzYXZlKAogICIuLzAyX291dHB1dC9wbG90cy9wbG90MTFfc2Vyb190eXBlb2ZtYWxhcmlhX2Rpc3RyaWN0X2dlbmRlci5wbmciLAogIHNlcm9fdHlwZW9mbWFsYXJpYV9kaXN0cmljdF9nZW5kZXIsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDguNQopCmBgYAoKIyMjIEJ5IFRpbWUgb2YgTWFsYXJpYQoKYGBge3J9CnNlcm9fdGltZW9mbWFsYXJpYV9kaXN0cmljdF9nZW5kZXIgPC0gc2Vyb3Bvc2l0aXZ5X3N1bW1hcmlzZSgKICBmZmlfdG90YWwsCiAgInRpbWVvZm1hbGFyaWEiLAogIGFnZV9jYXQsCiAgZ2VuZGVyCikgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gYWdlX2NhdCwKICAgICAgeSA9IHJlc3VsdF9leHBvc3VyZSwKICAgICAgY29sb3IgPSBleHBvc3VyZSwKICAgICAgZ3JvdXAgPSBleHBvc3VyZQogICAgKQogICkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKCkgKwogIGZhY2V0X2dyaWQoCiAgICB2YXJzKGdlbmRlciksCiAgICB2YXJzKGZmaV9pc19kaXN0cmljdCkgICAgCiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKAogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLAogICAgbGltaXRzID0gYygwLCAwLjQ1KQogICkgKwogIGxhYnMoCiAgICB4ID0gIkFnZSIsCiAgICB5ID0gIlNlcm9wb3NpdGl2aXR5IgogICkgKwogIGd1aWRlcygKICAgIGNvbG9yID0gZ3VpZGVfbGVnZW5kKCJNYWxhcmlhIikKICApICsKICBpbm5vdmFyOjpzY2FsZV9jb2xvcl9pbm5vdmEoIm5wciIpICsKICB0aGVtZV9idygpCgpzZXJvX3RpbWVvZm1hbGFyaWFfZGlzdHJpY3RfZ2VuZGVyCmBgYAoKYGBge3IgZXZhbD1GQUxTRX0KZ2dzYXZlKAogICIuLzAyX291dHB1dC9wbG90cy9wbG90MTJfc2Vyb190aW1lb2ZtYWxhcmlhX2Rpc3RyaWN0X2dlbmRlci5wbmciLAogIHNlcm9fdGltZW9mbWFsYXJpYV9kaXN0cmljdF9nZW5kZXIsCiAgZHBpID0gMzAwLAogIGJnID0gIndoaXRlIiwKICB3aWR0aCA9IDEyLAogIGhlaWdodCA9IDguNQopCmBgYAoKCiMgTWFwcwoKYGBge3J9CmxpYnJhcnkoc2YpCmxpYnJhcnkobGVhZmxldCkKYGBgCgpgYGB7cn0KZmZpX3RvdGFsX2dwcyA8LSBmZmlfdG90YWwgJT4lCiAgc2VsZWN0KAogICAgZmZpX2lzX2NvZF9jb206ZmZpX2lzX2NvZF9pbmQsCiAgICBwZl9yZWNlbnQ6cHZfaGlzdG9yaWMsCiAgICBwdl9leHBvc3VyZTpoaXN0b3JpY2FsX2V4cG9zdXJlCiAgKSAlPiUKICBsZWZ0X2pvaW4oCiAgICBmZmlfaG91c2Vob2xkICU+JQogICAgICBzZWxlY3QoCiAgICAgICAgZmZpX2hfY29kZV9jb21tdW5pdHk6ZmZpX2hfY29kZV9ob3VzZWhvbGQsCiAgICAgICAgZmZpX2hfY29tbXVuaXR5CiAgICAgICksCiAgICBieSA9IGMoCiAgICAgICJmZmlfaXNfY29kX2NvbSIgPSAiZmZpX2hfY29kZV9jb21tdW5pdHkiLAogICAgICAiZmZpX2lzX2NvZF9ob3VzZWhvbGQiID0gImZmaV9oX2NvZGVfaG91c2Vob2xkIgogICAgKQogICkgCgpmZmlfaG91c2Vob2xkX2dwcyA8LSBmZmlfdG90YWxfZ3BzICU+JQogIHNlbGVjdCgKICAgIGZmaV9pc19jb2RfY29tOmZmaV9pc19jb2RfaG91c2Vob2xkLAogICAgZmZpX2hfY29tbXVuaXR5LAogICAgcmVjZW50X2V4cG9zdXJlCiAgKSAlPiUKICBtdXRhdGUoCiAgICByZWNlbnRfZXhwb3N1cmUgPSBjYXNlX3doZW4oCiAgICAgIHJlY2VudF9leHBvc3VyZSA9PSAiUG9zaXRpdmUiIH4gMSwKICAgICAgVFJVRSB+IDAKICAgICkKICApICU+JQogIGdyb3VwX2J5KAogICAgYWNyb3NzKGMoZmZpX2lzX2NvZF9jb206ZmZpX2hfY29tbXVuaXR5KSkKICApICU+JQogIHN1bW1hcmlzZSgKICAgIHJlY2VudF9leHBvc3VyZSA9IG1lYW4ocmVjZW50X2V4cG9zdXJlKQogICkgJT4lCiAgdW5ncm91cCgpCiAgIyBtdXRhdGUoCiAgIyAgIGNvbG9yX21hcmtlciA9IGNhc2Vfd2hlbigKICAjICAgICByZWNlbnRfZXhwb3N1cmUgPT0gMCB+ICJyZWQiLAogICMgICAgIFRSVUUgfiAiYmxhY2siCiAgIyAgICkKICAjICkKCmZmaV9ob3VzZWhvbGRfZ3BzIDwtIGZmaV9ob3VzZWhvbGRfZ3BzICU+JQogIGxlZnRfam9pbigKICAgIGZmaV9ob3VzZWhvbGQgJT4lCiAgICAgIHNlbGVjdCgKICAgICAgICBmZmlfaF9jb2RlX2NvbW11bml0eTpmZmlfaF9jb2RlX2hvdXNlaG9sZCwKICAgICAgICBmZmlfaF9kaXN0cmljdCwKICAgICAgICBmZmlfZ3BzX2xvbmcsCiAgICAgICAgZmZpX2dwc19sYXQKICAgICAgKSwKICAgIGJ5ID0gYygKICAgICAgImZmaV9pc19jb2RfY29tIiA9ICJmZmlfaF9jb2RlX2NvbW11bml0eSIsCiAgICAgICJmZmlfaXNfY29kX2hvdXNlaG9sZCIgPSAiZmZpX2hfY29kZV9ob3VzZWhvbGQiCiAgICApCiAgKSAlPiUKICBtdXRhdGUoCiAgICBmZmlfaF9ob3VzZWhvbGRfaWQgPSBwYXN0ZTAoZmZpX2lzX2NvZF9jb20sIGZmaV9pc19jb2RfaG91c2Vob2xkKSwKICAgIGZmaV9pc19jb2RfY29tX2xhYmVsID0gcGFzdGUwKAogICAgICAiQ29kOiAiLAogICAgICBmZmlfaXNfY29kX2hvdXNlaG9sZCwKICAgICAgIiAtICIsCiAgICAgIHN0cl90b190aXRsZShmZmlfaF9jb21tdW5pdHkpLAogICAgICAiICgiLAogICAgICBzdHJfdG9fdGl0bGUoZmZpX2hfZGlzdHJpY3QpLAogICAgICAiKSIKICAgICkKICApICU+JQogIHN0X2FzX3NmKAogICAgY29vcmRzID0gYygiZmZpX2dwc19sb25nIiwgImZmaV9ncHNfbGF0IiksCiAgICBjcnMgPSA0MzI2CiAgKSAKICAKCiAgCiMgY29sb3JzX3BhbCA8LSByZXYoaW5ub3Zhcjo6Omlubm92YV9wYWxldHRlc1tbImVjb21zdCJdXSkKIyBwYWwgPC0gY29sb3JOdW1lcmljKAojICAgY29sb3JSYW1wKGNvbG9yc19wYWwpLAojICAgZmZpX2hvdXNlaG9sZF9ncHMkcmVjZW50X2V4cG9zdXJlCiMgKQoKcGFsIDwtIGNvbG9yTnVtZXJpYygKICBoY2wuY29sb3JzKDE3LCBwYWxldHRlID0gInppc3NvdSIpLAogIGZmaV9ob3VzZWhvbGRfZ3BzJHJlY2VudF9leHBvc3VyZQopCgojIGljb25zX2hvdXNlaG9sZCA8LSBhd2Vzb21lSWNvbnMoCiMgICBpY29uID0gImlvcy1ob21lIiwKIyAgIGljb25Db2xvciA9ICJibGFjayIsCiMgICBsaWJyYXJ5ID0gImlvbiIsCiMgICBtYXJrZXJDb2xvciA9IGlubm92YXI6Omlubm92YV9wYWwoImVjb21zdCIsIHJldmVyc2UgPSBUUlVFKSgxNykKIyApCgpjb21tdW5pdGllc19zZiA8LSBjb21tdW5pdGllc19zZiAlPiUKICBtdXRhdGUoCiAgICBmZmlfaF9jb21tdW5pdHkgPSBzdHJfdG9fdGl0bGUoZmZpX2hfY29tbXVuaXR5KQogICkgJT4lCiAgbGVmdF9qb2luKAogICAgZmZpX2hvdXNlaG9sZCAlPiUKICAgICAgc2VsZWN0KGZmaV9oX2Rpc3RyaWN0LCBmZmlfaF9jb2RlX2NvbW11bml0eSkgJT4lCiAgICAgIGRpc3RpbmN0KCkKICApICAlPiUKICBtdXRhdGUoCiAgICBmZmlfaF9jb21tdW5pdHlfbGFiZWwgPSBwYXN0ZTAoCiAgICAgIGZmaV9oX2NvbW11bml0eSwKICAgICAgIiAoIiwKICAgICAgc3RyX3RvX3RpdGxlKGZmaV9oX2Rpc3RyaWN0KSwKICAgICAgIikiCiAgICApCiAgKQoKCgpob3VzZWhvbGRfY29tbXVuaXRpZXNfbGVhZnQgPC0gZmZpX2hvdXNlaG9sZF9ncHMgJT4lCiAgbGVhZmxldCgpICU+JQogIGFkZFByb3ZpZGVyVGlsZXMoCiAgICBwcm92aWRlcnMkT3BlblN0cmVldE1hcCwKICAgIGdyb3VwID0gIk9wZW5TdHJlZXRNYXAiCiAgKSAlPiUKICBhZGRDaXJjbGVNYXJrZXJzKAogICAgbGF5ZXJJZCA9IH5mZmlfaF9ob3VzZWhvbGRfaWQsCiAgICBsYWJlbCA9IH5mZmlfaXNfY29kX2NvbV9sYWJlbCwKICAgIGNvbG9yID0gfiBwYWwocmVjZW50X2V4cG9zdXJlKSwKICAgIGdyb3VwID0gIkhvdXNlaG9sZHMiLAogICAgcmFkaXVzID0gNywKICAgIHdlaWdodCA9IDUsCiAgICBvcGFjaXR5ID0gMSwKICAgIGZpbGxPcGFjaXR5ID0gMC4xLAogICAgbGFiZWxPcHRpb25zID0gbGFiZWxPcHRpb25zKAogICAgICBzdHlsZSA9IGxpc3QoCiAgICAgICAgImZvbnQtd2VpZ2h0IiA9ICJib2xkIiwKICAgICAgICBwYWRkaW5nID0gIjNweCA4cHgiCiAgICAgICksCiAgICAgIHRleHRzaXplID0gIjEycHgiLAogICAgICBkaXJlY3Rpb24gPSAiYXV0byIKICAgICkKICApICU+JQogICMgYWRkTGVnZW5kKAogICMgICB0aXRsZSA9ICJSZWNlbnQgRXhwb3N1cmUiLAogICMgICBwYWwgPSBwYWwsIAogICMgICB2YWx1ZXMgPSB+IHJlY2VudF9leHBvc3VyZSwgCiAgIyAgIGdyb3VwID0gImNpcmNsZXMiLCAKICAjICAgcG9zaXRpb24gPSAiYm90dG9tbGVmdCIsCiAgIyAgIHRyYW5zZm9ybSA9IH4gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLAogICMgICBvcGFjaXR5ID0gMQogICMgKSAlPiU8Zm9udC1hd2Vzb21lLWljb24gaWNvbj0iZmEtc29saWQgZmEtbG9jYXRpb24tZG90IiAvPgogIGxlYWZsZWdlbmQ6OmFkZExlZ2VuZE51bWVyaWMoCiAgICB0aXRsZSA9ICJSZWNlbnQgRXhwb3N1cmUiLAogICAgcGFsID0gcGFsLAogICAgdmFsdWVzID0gfiByZWNlbnRfZXhwb3N1cmUsCiAgICBwb3NpdGlvbiA9ICJib3R0b21yaWdodCIsCiAgICBvcmllbnRhdGlvbiA9ICJob3Jpem9udGFsIiwKICAgIGhlaWdodCA9IDIwLAogICAgd2lkdGggPSAxMDAsCiAgICBkZWNyZWFzaW5nID0gRkFMU0UsCiAgICBudW1iZXJGb3JtYXQgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KCksCiAgICBncm91cCA9ICJjaXJjbGVzIgogICkgICU+JQogIGFkZEF3ZXNvbWVNYXJrZXJzKAogICAgZGF0YSA9IGNvbW11bml0aWVzX3NmLAogICAgbGF5ZXJJZCA9IH5mZmlfaF9jb2RlX2NvbW11bml0eSwKICAgIGxhYmVsID0gfmZmaV9oX2NvbW11bml0eV9sYWJlbCwKICAgIGdyb3VwID0gIkNvbW11bml0aWVzIgogICkgJT4lCiAgYWRkUHJvdmlkZXJUaWxlcygKICAgIHByb3ZpZGVycyRPcGVuU3RyZWV0TWFwLAogICAgZ3JvdXAgPSAiT3BlblN0cmVldE1hcCIKICApICU+JQogIGFkZFRpbGVzKAogICAgdXJsVGVtcGxhdGUgPSAiaHR0cDovL210MC5nb29nbGUuY29tL3Z0L2x5cnM9bSZobD1lbiZ4PXt4fSZ5PXt5fSZ6PXt6fSZzPUdhIiwKICAgIGF0dHJpYnV0aW9uID0gIkdvb2dsZSBNYXBzIiwKICAgIG9wdGlvbnMgPSBsZWFmbGV0Ojp0aWxlT3B0aW9ucygKICAgICAgbWF4TmF0aXZlWm9vbSA9IDE5LAogICAgICBtYXhab29tID0gMjAKICAgICksCiAgICBncm91cCA9ICJHb29nbGUgTWFwcyIKICApICU+JQogIGFkZFRpbGVzKAogICAgdXJsVGVtcGxhdGUgPSAiaHR0cHM6Ly9tdDEuZ29vZ2xlLmNvbS92dC9seXJzPXMmeD17eH0meT17eX0mej17en0iLAogICAgYXR0cmlidXRpb24gPSAiU2F0ZWxsaXRlIFZpZXciLAogICAgb3B0aW9ucyA9IGxlYWZsZXQ6OnRpbGVPcHRpb25zKAogICAgICBtYXhOYXRpdmVab29tID0gMTksCiAgICAgIG1heFpvb20gPSAyMAogICAgKSwKICAgIGdyb3VwID0gIlNhdGVsbGl0ZSBWaWV3IgogICkgJT4lCiAgIyBMYXllcnMgY29udHJvbCoKICBhZGRMYXllcnNDb250cm9sKAogICAgb3ZlcmxheUdyb3VwcyA9IGMoIkhvdXNlaG9sZHMiLCAiQ29tbXVuaXRpZXMiKSwKICAgIGJhc2VHcm91cHMgPSBjKCJPcGVuU3RyZWV0TWFwIiwgIkdvb2dsZSBNYXBzIiwgIlNhdGVsbGl0ZSBWaWV3IiksCiAgICBvcHRpb25zID0gbGF5ZXJzQ29udHJvbE9wdGlvbnMoY29sbGFwc2VkID0gRkFMU0UpCiAgKSAlPiUKICAjIGFkZExlZ2VuZCgKICAjICAgInRvcHJpZ2h0IiwKICAjICAgcGFsID0gaW5ub3Zhcjo6aW5ub3ZhX3BhbCgiZWNvbXN0IiwgcmV2ZXJzZSA9IFRSVUUpKDk4MCkKICAjICkgICU+JQogICMgYWRkTGVnZW5kKAogICMgICBwb3NpdGlvbiA9ICJib3R0b21yaWdodCIsCiAgIyAgIGNvbG9ycyA9IGMoCiAgIyAgICAgIndoaXRlOyB3aWR0aDoxNXB4OyBoZWlnaHQ6MTVweDsKICAjICAgICAgICAgICAgICAgIGJvcmRlcjo1cHggc29saWQgcmVkOyBib3JkZXItcmFkaXVzOjUwJTsiLAogICMgICAgICJ3aGl0ZTsgd2lkdGg6Ny41cHg7IGhlaWdodDo3LjVweDsgbWFyZ2luLXRvcDogNXB4OwogICMgICAgICAgICAgICAgICAgYm9yZGVyOjVweCBzb2xpZCBibGFjazsgYm9yZGVyLXJhZGl1czo1MCU7IG1hcmdpbi1sZWZ0OjJweDsiCiAgIyAgICksCiAgIyAgIGxhYmVscyA9IGMoCiAgIyAgICAgIjxkaXYgc3R5bGU9J2Rpc3BsYXk6IGlubGluZS1ibG9jazsgaGVpZ2h0OiAxMHB4OwogICMgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDogOHB4O2xpbmUtaGVpZ2h0OiAxMHB4O2ZvbnQtd2VpZ2h0OiBib2xkOwogICMgICAgICAgICAgICAgICAgY29sb3I6IGJsYWNrOyAnPkF0IGxlYXN0IDEgcGVyc29uIHdpdGggcmVjZW50IG1hbGFyaWE8L2Rpdj4iLAogICMgICAgICI8ZGl2IHN0eWxlPSdkaXNwbGF5OiBpbmxpbmUtYmxvY2s7aGVpZ2h0OiAxMHB4OwogICMgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDogOHB4O2xpbmUtaGVpZ2h0OiAxMHB4O2ZvbnQtd2VpZ2h0OiBib2xkOwogICMgICAgICAgICAgICAgICAgY29sb3I6IGJsYWNrOyBtYXJnaW4tdG9wOiAxMHB4OwogICMgICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6NXB4Jz5ObyBvbmUgd2l0aCByZWNlbnQgbWFsYXJpYSBhdCBob3VzZWhvbGQ8L2Rpdj4iCiAgIyAgICksCiAgIyAgIG9wYWNpdHkgPSAxCiAgIyApICU+JQogIGxlYWZsZXQuZXh0cmFzOjphZGRSZXNldE1hcEJ1dHRvbigpCgpob3VzZWhvbGRfY29tbXVuaXRpZXNfbGVhZnQKYGBgCgoKYGBge3IgZXZhbD1GQUxTRX0KaHRtbHdpZGdldHM6OnNhdmVXaWRnZXQoCiAgaG91c2Vob2xkX2NvbW11bml0aWVzX2xlYWZ0LAogIGZpbGUgPSAiLi8wMl9vdXRwdXQvcGxvdHMvaG91c2Vob2xkX2NvbW11bml0aWVzX2xlYWZ0Lmh0bWwiCikKCndlYnNob3Q6OndlYnNob3QoCiAgIi4vMDJfb3V0cHV0L3Bsb3RzL2hvdXNlaG9sZF9jb21tdW5pdGllc19sZWFmdC5odG1sIiwKICAiLi8wMl9vdXRwdXQvcGxvdHMvaG91c2Vob2xkX2NvbW11bml0aWVzX2xlYWZ0LnBuZyIsCiAgY2xpcHJlY3QgPSAidmlld3BvcnQiLAogIHpvb20gPSA0CikKYGBg